RosettaCodeData/Task/JSON/Pascal/json.pas

77 lines
2.3 KiB
ObjectPascal

program test;
{$mode objfpc}{$h+}
uses
FpJson, JsonParser;
const
JsonValue =
'{ ' + LineEnding +
' "answer": { ' + LineEnding +
' "everything": 42 ' + LineEnding +
' }, ' + LineEnding +
' "happy": true, ' + LineEnding +
' "list": [ ' + LineEnding +
' 0, ' + LineEnding +
' 1, ' + LineEnding +
' 2 ' + LineEnding +
' ], ' + LineEnding +
' "name": "Pierrot", ' + LineEnding +
' "nothing": null, ' + LineEnding +
' "object": { ' + LineEnding +
' "product": "unknown",' + LineEnding +
' "amount": 1001 ' + LineEnding +
' }, ' + LineEnding +
' "pi": 3.1416 ' + LineEnding +
'} ';
function JsonsEqual(L, R: TJsonData): Boolean;
var
I: Integer;
e: TJsonEnum;
d: TJsonData;
begin
if (L = nil) or (R = nil) then exit(False);
if L = R then exit(True);
if (L.JSONType <> R.JSONType) or (L.Count <> R.Count) then exit(False);
case L.JSONType of
jtUnknown: exit(False);
jtNull: ;
jtBoolean: exit(L.AsBoolean = R.AsBoolean);
jtNumber: exit(L.AsFloat = R.AsFloat);
jtString: exit(L.AsString = R.AsString);
jtArray:
for I := 0 to Pred(L.Count) do
if not JsonsEqual(L.Items[I], R.Items[I]) then exit(False);
jtObject:
for e in L do begin
if not TJsonObject(R).Find(e.Key, d) then exit(False);
if not JsonsEqual(e.Value, d) then exit(False);
end;
end;
Result := True;
end;
var
Expected, HandMade: TJsonData;
begin
Expected := GetJson(JsonValue);
HandMade := CreateJSONObject([
'answer', CreateJSONObject(['everything', 42]),
'happy', True,
'list', CreateJSONArray([0, 1, 2]),
'name', 'Pierrot',
'nothing', CreateJSON,
'object', CreateJSONObject(['product', 'unknown', 'amount', 1001]),
'pi', 3.1416
]);
WriteLn(HandMade.FormatJson);
WriteLn;
if JsonsEqual(Expected, HandMade) then
WriteLn('Objects look identical')
else
WriteLn('Oops, something went wrong');
Expected.Free;
HandMade.Free;
end.