summaryrefslogtreecommitdiff
path: root/packages/fcl-json
diff options
context:
space:
mode:
authormichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-01-27 21:01:29 +0000
committermichael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2>2017-01-27 21:01:29 +0000
commit473a8a66603574e8851c4448150588e2039c28da (patch)
tree5ce65f706464002624a5f0e3cb54e09c4682a17d /packages/fcl-json
parent812d10a8527c23b08da3ccc0bf191aa81a7d2f47 (diff)
downloadfpc-473a8a66603574e8851c4448150588e2039c28da.tar.gz
* Patch from BBaz to add an overload to find returning a boolean (bug ID
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@35343 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-json')
-rw-r--r--packages/fcl-json/src/fpjson.pp87
-rw-r--r--packages/fcl-json/tests/testjsondata.pp23
2 files changed, 110 insertions, 0 deletions
diff --git a/packages/fcl-json/src/fpjson.pp b/packages/fcl-json/src/fpjson.pp
index 0f76870060..88f4dc8c71 100644
--- a/packages/fcl-json/src/fpjson.pp
+++ b/packages/fcl-json/src/fpjson.pp
@@ -537,6 +537,12 @@ Type
Function IndexOfName(const AName: TJSONStringType; CaseInsensitive : Boolean = False): Integer;
Function Find(Const AName : String) : TJSONData; overload;
Function Find(Const AName : String; AType : TJSONType) : TJSONData; overload;
+ function Find(const key: TJSONStringType; out AValue: TJSONData): boolean;
+ function Find(const key: TJSONStringType; out AValue: TJSONObject): boolean;
+ function Find(const key: TJSONStringType; out AValue: TJSONArray): boolean;
+ function Find(const key: TJSONStringType; out AValue: TJSONString): boolean;
+ function Find(const key: TJSONStringType; out AValue: TJSONBoolean): boolean;
+ function Find(const key: TJSONStringType; out AValue: TJSONNumber): boolean;
Function Get(Const AName : String) : Variant;
Function Get(Const AName : String; ADefault : TJSONFloat) : TJSONFloat;
Function Get(Const AName : String; ADefault : Integer) : Integer;
@@ -3155,6 +3161,87 @@ begin
Result:=Nil;
end;
+function TJSONObject.Find(const key: TJSONStringType; out AValue: TJSONData): boolean;
+begin
+ AValue := Find(key);
+ result := assigned(AValue);
+end;
+
+function TJSONObject.Find(const key: TJSONStringType; out AValue: TJSONObject): boolean;
+var
+ v: TJSONData;
+begin
+ v := Find(key);
+ if assigned(v) then
+ begin
+ result := v.JSONType = jtObject;
+ if result then
+ AValue := TJSONObject(v);
+ end
+ else
+ result := false;
+end;
+
+function TJSONObject.Find(const key: TJSONStringType; out AValue: TJSONArray): boolean;
+var
+ v: TJSONData;
+begin
+ v := Find(key);
+ if assigned(v) then
+ begin
+ result := v.JSONType = jtArray;
+ if result then
+ AValue := TJSONArray(v);
+ end
+ else
+ result := false;
+end;
+
+function TJSONObject.Find(const key: TJSONStringType; out AValue: TJSONString): boolean;
+var
+ v: TJSONData;
+begin
+ v := Find(key);
+ if assigned(v) then
+ begin
+ result := v.JSONType = jtString;
+ if result then
+ AValue := TJSONString(v);
+ end
+ else
+ result := false;
+end;
+
+function TJSONObject.Find(const key: TJSONStringType; out AValue: TJSONBoolean): boolean;
+var
+ v: TJSONData;
+begin
+ v := Find(key);
+ if assigned(v) then
+ begin
+ result := v.JSONType = jtBoolean;
+ if result then
+ AValue := TJSONBoolean(v);
+ end
+ else
+ result := false;
+end;
+
+function TJSONObject.Find(const key: TJSONStringType; out AValue: TJSONNumber): boolean;
+var
+ v: TJSONData;
+begin
+ v := Find(key);
+ if assigned(v) then
+ begin
+ result := v.JSONType = jtNumber;
+ if result then
+ AValue := TJSONNumber(v);
+ end
+ else
+ result := false;
+end;
+
initialization
// Need to force initialization;
TJSONData.DetermineElementSeparators;
diff --git a/packages/fcl-json/tests/testjsondata.pp b/packages/fcl-json/tests/testjsondata.pp
index f8c2a4d84e..58f84b04ba 100644
--- a/packages/fcl-json/tests/testjsondata.pp
+++ b/packages/fcl-json/tests/testjsondata.pp
@@ -256,6 +256,7 @@ type
Procedure TestFormat;
Procedure TestFormatNil;
Procedure TestFind;
+ Procedure TestIfFind;
end;
{ TTestJSONPath }
@@ -3553,6 +3554,28 @@ begin
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
+ TestJSONType(J,jtObject);
+ TestIsNull(J,False);
+ TestItemCount(J,3);
+ AssertEquals('boolean found', true, j.Find('b', B));
+ 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;
+end;
+
procedure TTestObject.TestCreateString;