mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 15:09:19 +02:00
* Do not allow duplicate keys in JSONObject
git-svn-id: trunk@38908 -
This commit is contained in:
parent
b8378ef774
commit
f540dbfab3
@ -470,6 +470,7 @@ Type
|
||||
ObjEndSeps : Array[Boolean] of TJSONStringType = (' }','}');
|
||||
Class var FUnquotedMemberNames: Boolean;
|
||||
Class var FObjStartSep,FObjEndSep,FElementEnd,FElementStart : TJSONStringType;
|
||||
function DoAdd(const AName: TJSONStringType; AValue: TJSONData; FreeOnError: Boolean=True): Integer;
|
||||
Class procedure DetermineElementQuotes;
|
||||
Private
|
||||
FHash : TFPHashObjectList; // Careful : Names limited to 255 chars.
|
||||
@ -638,6 +639,7 @@ Resourcestring
|
||||
SErrOddNumber = 'TJSONObject must be constructed with name,value pairs';
|
||||
SErrNameMustBeString = 'TJSONObject constructor element name at pos %d is not a string';
|
||||
SErrNonexistentElement = 'Unknown object member: "%s"';
|
||||
SErrDuplicateValue = 'Duplicate object member: "%s"';
|
||||
SErrPathElementNotFound = 'Path "%s" invalid: element "%s" not found.';
|
||||
SErrWrongInstanceClass = 'Cannot set instance class: %s does not descend from %s.';
|
||||
SErrNoParserHandler = 'No JSON parser handler installed. Recompile your project with the jsonparser unit included';
|
||||
@ -2943,58 +2945,69 @@ begin
|
||||
FHash.Clear;
|
||||
end;
|
||||
|
||||
function TJSONObject.DoAdd(const AName: TJSONStringType; AValue: TJSONData; FreeOnError : Boolean = True): Integer;
|
||||
begin
|
||||
if (IndexOfName(aName)<>-1) then
|
||||
begin
|
||||
if FreeOnError then
|
||||
FreeAndNil(AValue);
|
||||
DoError(SErrDuplicateValue,[aName]);
|
||||
end;
|
||||
Result:=FHash.Add(AName,AValue);
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; AValue: TJSONData
|
||||
): Integer;
|
||||
begin
|
||||
Result:=FHash.Add(AName,AValue);
|
||||
Result:=DoAdd(aName,AValue,False);
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; AValue: Boolean
|
||||
): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; AValue: TJSONFloat): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName, AValue: TJSONStringType): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: String; AValue: TJSONUnicodeStringType
|
||||
): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; Avalue: Integer): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; Avalue: Int64): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; Avalue: QWord): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON(AValue));
|
||||
Result:=DoAdd(AName,CreateJSON(AValue));
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType): Integer;
|
||||
begin
|
||||
Result:=Add(AName,CreateJSON);
|
||||
Result:=DoAdd(AName,CreateJSON);
|
||||
end;
|
||||
|
||||
function TJSONObject.Add(const AName: TJSONStringType; AValue: TJSONArray
|
||||
): Integer;
|
||||
begin
|
||||
Result:=Add(AName,TJSONData(AValue));
|
||||
Result:=DoAdd(AName,TJSONData(AValue),False);
|
||||
end;
|
||||
|
||||
procedure TJSONObject.Delete(Index: Integer);
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="10"/>
|
||||
<Version Value="11"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<SaveOnlyProjectUnits Value="True"/>
|
||||
@ -21,10 +21,18 @@
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
<CommandLineParams Value="--suite=TTestParser.TestArray"/>
|
||||
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
<FormatVersion Value="2"/>
|
||||
<Modes Count="1">
|
||||
<Mode0 Name="default">
|
||||
<local>
|
||||
<CommandLineParams Value="--suite=TTestParser.TestArray"/>
|
||||
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
|
||||
</local>
|
||||
</Mode0>
|
||||
</Modes>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="1">
|
||||
<Item1>
|
||||
|
@ -19,7 +19,7 @@ unit testjsondata;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, fpcunit, testregistry, fpjson;
|
||||
Classes, SysUtils, fpcunit, testregistry, fpjson, contnrs;
|
||||
|
||||
type
|
||||
TMyNull = Class(TJSONNull);
|
||||
@ -212,8 +212,14 @@ type
|
||||
|
||||
TTestObject = class(TTestJSON)
|
||||
private
|
||||
FJ: TJSONObject;
|
||||
procedure AppendA;
|
||||
protected
|
||||
Procedure Setup; override;
|
||||
Procedure TearDown; override;
|
||||
procedure TestAddBoolean(B : Boolean);
|
||||
Procedure TestAccessError;
|
||||
Property J : TJSONObject Read FJ;
|
||||
published
|
||||
Procedure TestCreate;
|
||||
Procedure TestCreateString;
|
||||
@ -257,6 +263,7 @@ type
|
||||
Procedure TestFormatNil;
|
||||
Procedure TestFind;
|
||||
Procedure TestIfFind;
|
||||
Procedure TestDuplicate;
|
||||
end;
|
||||
|
||||
{ TTestJSONPath }
|
||||
@ -3060,12 +3067,7 @@ end;
|
||||
|
||||
procedure TTestObject.TestCreate;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create;
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,0);
|
||||
TestJSON(J,'{}');
|
||||
@ -3076,9 +3078,6 @@ begin
|
||||
TestAsQword(J,1,True);
|
||||
TestAsString(J,'',True);
|
||||
TestAsFloat(J,0.0,True);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddInteger;
|
||||
@ -3086,12 +3085,7 @@ procedure TTestObject.TestAddInteger;
|
||||
Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,Integer(0));
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
@ -3102,9 +3096,6 @@ begin
|
||||
TestAsInt64(J[A],0);
|
||||
TestAsQword(J[A],0);
|
||||
TestJSON(J,'{ "'+A+'" : 0 }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddInt64;
|
||||
@ -3112,12 +3103,7 @@ procedure TTestObject.TestAddInt64;
|
||||
Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,Int64(0));
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
@ -3128,9 +3114,6 @@ begin
|
||||
TestAsInt64(J[A],0);
|
||||
TestAsQword(J[A],0);
|
||||
TestJSON(J,'{ "'+A+'" : 0 }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddFloat;
|
||||
@ -3139,13 +3122,10 @@ Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
S : String;
|
||||
F : TJSONFloat;
|
||||
begin
|
||||
F:=1.2;
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,F);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
@ -3155,9 +3135,18 @@ begin
|
||||
TestAsFloat(J[A],F);
|
||||
Str(F,S);
|
||||
TestJSON(J,'{ "'+a+'" :'+S+' }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
|
||||
procedure TTestObject.Setup;
|
||||
begin
|
||||
inherited Setup;
|
||||
FJ:=TJSONObject.Create;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TearDown;
|
||||
begin
|
||||
FreeAndNil(FJ);
|
||||
inherited TearDown;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddBoolean(B : Boolean);
|
||||
@ -3165,13 +3154,8 @@ procedure TTestObject.TestAddBoolean(B : Boolean);
|
||||
Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
B:=True;
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,B);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtBoolean);
|
||||
@ -3182,24 +3166,12 @@ begin
|
||||
TestJSON(J,'{ "'+a+'" : true }')
|
||||
else
|
||||
TestJSON(J,'{ "'+a+'" : false }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAccessError;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Strings['NonExist'];
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddBooleanTrue;
|
||||
@ -3220,13 +3192,10 @@ Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
S : String;
|
||||
|
||||
begin
|
||||
S:='A string';
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,S);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[a],jtString);
|
||||
@ -3234,9 +3203,6 @@ begin
|
||||
TestAsString(J[a],S);
|
||||
AssertEquals('J.Strings[''a'']="'+S+'"',S,J.Strings[A]);
|
||||
TestJSON(J,'{ "'+a+'" : "'+StringToJSONString(S)+'" }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddNull;
|
||||
@ -3244,12 +3210,7 @@ procedure TTestObject.TestAddNull;
|
||||
Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(a);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[a],jtNull);
|
||||
@ -3257,9 +3218,6 @@ begin
|
||||
AssertEquals('J.Nulls[''a'']=True',True,J.Nulls[A]);
|
||||
TestIsNull(J[a],true);
|
||||
TestJSON(J,'{ "'+a+'" : null }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddObject;
|
||||
@ -3270,11 +3228,9 @@ Const
|
||||
C = 'c';
|
||||
|
||||
Var
|
||||
J,J2 : TJSONObject;
|
||||
J2 : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J2:=TJSonObject.Create;
|
||||
J2.Add(B,0);
|
||||
J2.Add(C,1);
|
||||
@ -3290,9 +3246,6 @@ begin
|
||||
TestAsQword(J.Objects[A][B],0);
|
||||
TestAsQword(J.Objects[A][C],1);
|
||||
TestJSON(J,'{ "a" : { "b" : 0, "c" : 1 } }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestAddArray;
|
||||
@ -3301,12 +3254,9 @@ Const
|
||||
A = 'a';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
J2 : TJSONArray;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create;
|
||||
try
|
||||
J2:=TJSonArray.Create;
|
||||
J2.Add(0);
|
||||
J2.Add(1);
|
||||
@ -3322,9 +3272,6 @@ begin
|
||||
TestAsQword(J.Arrays[A][0],0);
|
||||
TestAsQword(J.Arrays[A][1],1);
|
||||
TestJSON(J,'{ "a" : [0, 1] }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestDelete;
|
||||
@ -3333,12 +3280,7 @@ Const
|
||||
A = 'a';
|
||||
B = 'b';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,0);
|
||||
J.Add(B,1);
|
||||
TestItemCount(J,2);
|
||||
@ -3349,9 +3291,6 @@ begin
|
||||
TestItemCount(J,1);
|
||||
J.Delete(0);
|
||||
TestItemCount(J,0);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestRemove;
|
||||
@ -3362,12 +3301,9 @@ Const
|
||||
C = 'c';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
I : TJSONData;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,1);
|
||||
J.Add(B,2);
|
||||
J.Add(C,3);
|
||||
@ -3385,20 +3321,15 @@ begin
|
||||
TestAsInt64(J[c],3);
|
||||
TestAsQword(J[a],1);
|
||||
TestAsQword(J[c],3);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestClone;
|
||||
|
||||
Var
|
||||
J,J2 : TJSONObject;
|
||||
J2 : TJSONObject;
|
||||
D : TJSONData;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add('p1',1);
|
||||
J.Add('p2','aloha');
|
||||
D:=J.Clone;
|
||||
@ -3413,30 +3344,26 @@ begin
|
||||
finally
|
||||
D.Free;
|
||||
end;
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestMyClone;
|
||||
|
||||
Var
|
||||
J : TMyObject;
|
||||
D : TJSONData;
|
||||
O : TMyObject;
|
||||
|
||||
begin
|
||||
J:=TMyObject.Create;
|
||||
try
|
||||
J.Add('p1',1);
|
||||
J.Add('p2','aloha');
|
||||
D:=J.Clone;
|
||||
D:=Nil;
|
||||
O:=TMyObject.Create;
|
||||
try
|
||||
O.Add('p1',1);
|
||||
O.Add('p2','aloha');
|
||||
D:=O.Clone;
|
||||
TestJSONType(D,jtObject);
|
||||
AssertEquals('Correct class',TMYObject,D.ClassType);
|
||||
finally
|
||||
D.Free;
|
||||
end;
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
O.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3447,12 +3374,10 @@ Const
|
||||
B = 'b';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
JA,JB : TJSONData;
|
||||
E : TJSONData;
|
||||
|
||||
begin
|
||||
J:=TJSonObject.Create;
|
||||
try
|
||||
J.Add(A,0);
|
||||
J.Add(B,1);
|
||||
TestItemCount(J,2);
|
||||
@ -3469,10 +3394,6 @@ begin
|
||||
AssertSame('Extracted JB',JA,E);
|
||||
E.Free;
|
||||
TestItemCount(J,0);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestNonExistingAccessError;
|
||||
@ -3504,19 +3425,11 @@ end;
|
||||
|
||||
procedure TTestObject.TestFormatNil;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create;
|
||||
try
|
||||
J.Add('a',1);
|
||||
J.Add('b',TJSONObject(Nil));
|
||||
TestJSON(J,'{ "a" : 1, "b" : null }');
|
||||
AssertEquals('FormatJSON, single line',J.AsJSON,J.FormatJSON([foSingleLineObject],1));
|
||||
finally
|
||||
J.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestFind;
|
||||
@ -3529,12 +3442,10 @@ Const
|
||||
C = 'c';
|
||||
S3 = 'Yet Another string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S,B,S2,C,S3]);
|
||||
try
|
||||
J.Add(A,S);
|
||||
J.Add(B,S2);
|
||||
J.Add(C,S3);
|
||||
TestJSONType(J,jtObject);
|
||||
TestIsNull(J,False);
|
||||
TestItemCount(J,3);
|
||||
@ -3549,21 +3460,18 @@ begin
|
||||
AssertEquals('4 Existing exact match, case insensitive',1,J.IndexOfName(B,true));
|
||||
AssertEquals('5 Existing , case sensitive again',2,J.IndexOfName(C));
|
||||
AssertEquals('6 Existing case-insensitive match, case insensitive',2,J.IndexOfName(Uppercase(C),true));
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
Procedure TTestObject.TestIfFind;
|
||||
Var
|
||||
J: TJSONObject;
|
||||
B: TJSONBoolean;
|
||||
S: TJSONString;
|
||||
N: TJSONNumber;
|
||||
D: TJSONData;
|
||||
begin
|
||||
J:=TJSONObject.Create(['s', 'astring', 'b', true, 'n', 1]);
|
||||
try
|
||||
J.Add('s', 'astring');
|
||||
J.Add('b', true);
|
||||
J.Add('n', 1);
|
||||
TestJSONType(J,jtObject);
|
||||
TestIsNull(J,False);
|
||||
TestItemCount(J,3);
|
||||
@ -3571,9 +3479,19 @@ begin
|
||||
AssertEquals('string found', true, j.Find('s', S));
|
||||
AssertEquals('number found', true, j.Find('n', N));
|
||||
AssertEquals('data found', true, j.Find('s', D));
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
|
||||
procedure TTestObject.AppendA;
|
||||
|
||||
begin
|
||||
J.Add('A','S')
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestDuplicate;
|
||||
|
||||
begin
|
||||
J.Add('A',TJSONObject.Create);
|
||||
AssertException(EJSON,@AppendA);
|
||||
end;
|
||||
|
||||
|
||||
@ -3583,42 +3501,29 @@ Const
|
||||
A = 'A';
|
||||
S = 'A string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
J.Add(A,S);
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSON(J,'{ "A" : "'+S+'" }');
|
||||
TestIsNull(J,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestCreateStringUnquoted;
|
||||
|
||||
Const
|
||||
A = 'A';
|
||||
S = 'A string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnquotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
J.Add(A,S);
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSON(J,'{ A : "'+S+'" }');
|
||||
TestIsNull(J,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestObject.TestCreatePchar;
|
||||
@ -3628,18 +3533,18 @@ Const
|
||||
S = 'A string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,Pchar(S)]);
|
||||
O:=TJSONObject.Create([A,Pchar(S)]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSON(J,'{ "A" : "'+S+'" }');
|
||||
TestIsNull(J,False);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSON(O,'{ "A" : "'+S+'" }');
|
||||
TestIsNull(O,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3650,19 +3555,19 @@ Const
|
||||
S = 'A string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,Pchar(S)]);
|
||||
O:=TJSONObject.Create([A,Pchar(S)]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSON(J,'{ A : "'+S+'" }');
|
||||
TestIsNull(J,False);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSON(O,'{ A : "'+S+'" }');
|
||||
TestIsNull(O,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3675,19 +3580,19 @@ Const
|
||||
T = 'B string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S,B,T]);
|
||||
O:=TJSONObject.Create([A,S,B,T]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,2);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSONType(J[B],jtString);
|
||||
TestJSON(J,'{ "A" : "'+S+'", "B" : "'+T+'" }');
|
||||
TestIsNull(J,False);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,2);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSONType(O[B],jtString);
|
||||
TestJSON(O,'{ "A" : "'+S+'", "B" : "'+T+'" }');
|
||||
TestIsNull(O,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3700,20 +3605,20 @@ Const
|
||||
T = 'B string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONData.CompressedJSON:=True;
|
||||
J:=TJSONObject.Create([A,S,B,T]);
|
||||
O:=TJSONObject.Create([A,S,B,T]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,2);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSONType(J[B],jtString);
|
||||
TestJSON(J,'{"A":"'+S+'","B":"'+T+'"}');
|
||||
TestIsNull(J,False);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,2);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSONType(O[B],jtString);
|
||||
TestJSON(O,'{"A":"'+S+'","B":"'+T+'"}');
|
||||
TestIsNull(O,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3726,21 +3631,21 @@ Const
|
||||
T = 'B string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONData.CompressedJSON:=True;
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,S,B,T]);
|
||||
O:=TJSONObject.Create([A,S,B,T]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,2);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSONType(J[B],jtString);
|
||||
TestJSON(J,'{A:"'+S+'",B:"'+T+'"}');
|
||||
TestIsNull(J,False);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,2);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSONType(O[B],jtString);
|
||||
TestJSON(O,'{A:"'+S+'",B:"'+T+'"}');
|
||||
TestIsNull(O,False);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3751,17 +3656,17 @@ Const
|
||||
S = 3;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
TestJSON(J,'{ "A" : 3 }');
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtNumber);
|
||||
TestJSON(O,'{ "A" : 3 }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3771,18 +3676,18 @@ Const
|
||||
S = 3;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
TestJSON(J,'{ A : 3 }');
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtNumber);
|
||||
TestJSON(O,'{ A : 3 }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3793,19 +3698,19 @@ Const
|
||||
S : double = 1.2;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
r : String;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtNumber);
|
||||
Str(S,R);
|
||||
TestJSON(J,'{ "A" :'+R+' }');
|
||||
TestJSON(O,'{ "A" :'+R+' }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3815,20 +3720,20 @@ Const
|
||||
S : double = 1.2;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
r : String;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtNumber);
|
||||
Str(S,R);
|
||||
TestJSON(J,'{ A :'+R+' }');
|
||||
TestJSON(O,'{ A :'+R+' }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3839,17 +3744,17 @@ Const
|
||||
S : Int64 = $FFFFFFFFFFFFF;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
TestJSON(J,'{ "A" : '+IntToStr(S)+' }');
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtNumber);
|
||||
TestJSON(O,'{ "A" : '+IntToStr(S)+' }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3859,18 +3764,18 @@ Const
|
||||
S : Int64 = $FFFFFFFFFFFFF;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtNumber);
|
||||
TestJSON(J,'{ A : '+IntToStr(S)+' }');
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtNumber);
|
||||
TestJSON(O,'{ A : '+IntToStr(S)+' }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3881,17 +3786,17 @@ Const
|
||||
S = True;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtBoolean);
|
||||
TestJSON(J,'{ "A" : true }');
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtBoolean);
|
||||
TestJSON(O,'{ "A" : true }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3901,18 +3806,18 @@ Const
|
||||
S = True;
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,S]);
|
||||
O:=TJSONObject.Create([A,S]);
|
||||
try
|
||||
TestJSONType(J,jtObject);
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtBoolean);
|
||||
TestJSON(J,'{ A : true }');
|
||||
TestJSONType(O,jtObject);
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtBoolean);
|
||||
TestJSON(O,'{ A : true }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3922,16 +3827,16 @@ Const
|
||||
A = 'A';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,TJSONObject.Create]);
|
||||
O:=TJSONObject.Create([A,TJSONObject.Create]);
|
||||
try
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtObject);
|
||||
TestJSON(J,'{ "A" : {} }');
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtObject);
|
||||
TestJSON(O,'{ "A" : {} }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3940,17 +3845,17 @@ Const
|
||||
A = 'A';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,TJSONObject.Create]);
|
||||
O:=TJSONObject.Create([A,TJSONObject.Create]);
|
||||
try
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtObject);
|
||||
TestJSON(J,'{ A : {} }');
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtObject);
|
||||
TestJSON(O,'{ A : {} }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3961,16 +3866,16 @@ Const
|
||||
S = 'A string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
J:=TJSONObject.Create([A,TJSONString.Create(S)]);
|
||||
O:=TJSONObject.Create([A,TJSONString.Create(S)]);
|
||||
try
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSON(J,'{ "A" : "'+S+'" }');
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSON(O,'{ "A" : "'+S+'" }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3981,17 +3886,17 @@ Const
|
||||
S = 'A string';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
|
||||
begin
|
||||
TJSONObject.UnQuotedMemberNames:=True;
|
||||
J:=TJSONObject.Create([A,TJSONString.Create(S)]);
|
||||
O:=TJSONObject.Create([A,TJSONString.Create(S)]);
|
||||
try
|
||||
TestItemCount(J,1);
|
||||
TestJSONType(J[A],jtString);
|
||||
TestJSON(J,'{ A : "'+S+'" }');
|
||||
TestItemCount(O,1);
|
||||
TestJSONType(O[A],jtString);
|
||||
TestJSON(O,'{ A : "'+S+'" }');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -4001,19 +3906,19 @@ Const
|
||||
A = 'A';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TObject;
|
||||
O : TJSONObject;
|
||||
OO : TObject;
|
||||
|
||||
begin
|
||||
J:=Nil;
|
||||
O:=Nil;
|
||||
try
|
||||
Try
|
||||
O:=TObject.Create;
|
||||
J:=TJSONObject.Create([A,O]);
|
||||
OO:=TObject.Create;
|
||||
O:=TJSONObject.Create([A,OO]);
|
||||
Fail('Array constructor accepts only TJSONData');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
FreeAndNil(OO);
|
||||
end;
|
||||
except
|
||||
// Should be OK.
|
||||
@ -4026,17 +3931,17 @@ Const
|
||||
A = 'A';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
P : Pointer;
|
||||
|
||||
begin
|
||||
J:=Nil;
|
||||
O:=Nil;
|
||||
P:=Nil;
|
||||
Try
|
||||
J:=TJSONObject.Create([A,P]);
|
||||
TestJSONType(J[A],jtNull);
|
||||
O:=TJSONObject.Create([A,P]);
|
||||
TestJSONType(O[A],jtNull);
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -4046,18 +3951,18 @@ Const
|
||||
A = 'A';
|
||||
|
||||
Var
|
||||
J : TJSONObject;
|
||||
O : TJSONObject;
|
||||
P : Pointer;
|
||||
|
||||
begin
|
||||
J:=Nil;
|
||||
O:=Nil;
|
||||
P:=@Self;
|
||||
try
|
||||
Try
|
||||
J:=TJSONObject.Create([A,P]);
|
||||
O:=TJSONObject.Create([A,P]);
|
||||
Fail('Array constructor accepts only NIL pointers');
|
||||
finally
|
||||
FreeAndNil(J);
|
||||
FreeAndNil(O);
|
||||
end;
|
||||
except
|
||||
// Should be OK.
|
||||
|
Loading…
Reference in New Issue
Block a user