How to check if a particular element exists in SuperObject?

4.5k Views Asked by At

I widely use the SuperObject JSON library. I need to be able to check if a particular element exists in an object or not. I can check the value of an element, for example an integer that doesn't exist returns 0. However, 0 is one of the possible values if it does exist - so I can't depend on observing 0 for the element's existence. I checked the ISuperObject for methods that can do this (for example I'd expect something like ISuperObject.Exists(const S: String): Boolean;), but see nothing like this.

How can I check if a particular element exists in the JSON object or not?

2

There are 2 best solutions below

2
On BEST ANSWER

The latest update of SuperObject contains an Exists() function.

var
  obj : ISuperObject;
begin
  obj := TSuperObject.ParseFile('..\..\SAMPLE.JSON',FALSE);
  if not obj.AsObject.Exists('FindMe') then begin
    WriteLn('Not found');
  end;
end;

If you should use the dwsJSON parser instead, there is a similar function to use:

if json['DoesNotExists'].ElementCount = 0 then begin
  WriteLn('Not found');
end;
0
On

You can check if certain field exists like this:

function FieldExists(const ASuperObject: ISuperObject; const AField: String): Boolean;
var
  o: ISuperObject;
begin
  o := ASuperObject.O[AField];
  result := Assigned(o);
end;

Basically, json_superobject.O[field_name] should return pointer to ISuperObject if field_name exists. Otherwise, it returns nil.