diff options
author | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-01-27 21:01:29 +0000 |
---|---|---|
committer | michael <michael@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-01-27 21:01:29 +0000 |
commit | 473a8a66603574e8851c4448150588e2039c28da (patch) | |
tree | 5ce65f706464002624a5f0e3cb54e09c4682a17d /packages/fcl-json | |
parent | 812d10a8527c23b08da3ccc0bf191aa81a7d2f47 (diff) | |
download | fpc-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.pp | 87 | ||||
-rw-r--r-- | packages/fcl-json/tests/testjsondata.pp | 23 |
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; |