* Patch from BBaz to add an overload to find returning a boolean (bug ID

git-svn-id: trunk@35343 -
This commit is contained in:
michael 2017-01-27 21:01:29 +00:00
parent 2265312872
commit 1a771735ac
2 changed files with 110 additions and 0 deletions

View File

@ -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;

View File

@ -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;