I recently updated my JSON-Library. Both, IJSONObject and IJSONArray now have methods to check for the type of the nested items.
IJSONObject = interface
['{D00A665F-3CBB-4DDB-8300-FB8020DA564B}']
.
.
.
function isJSONObject(aKey : string) : boolean;
function isJSONArray(aKey : string) : boolean;
function isString(aKey : string) : boolean;
function isInteger(aKey : string) : boolean;
function isBoolean(aKey : string) : boolean;
function isDouble(aKey : string) : boolean;
end;
IJSONArray = interface
['{B120D59A-1D00-469E-97CE-AE2A635A51ED}']
.
.
.
function isJSONObject(aIndex : integer) : boolean;
function isJSONArray(aIndex : integer) : boolean;
function isString(aIndex : integer) : boolean;
function isInteger(aIndex : integer) : boolean;
function isBoolean(aIndex : integer) : boolean;
function isDouble(aIndex : integer) : boolean;
end;
Usage:
var
jo : IJSONObject;
begin
jo := TJSON.NewObject('{"string":"abc", "integer":123}');
jo.isString('string'); // true
jo.isInteger('integer'); // true
jo.isBoolean('string'); // false
end;
The implementation is very strict, e.g. isDouble will return false if the value is an integer and could be accessed as a double. I also included unit tests to cover these methods.