查找JSONValue的值类型(TJSONArray或TJSONObject)

时间:2015-05-29 18:47:20

标签: arrays json delphi object delphi-xe8

我想用Delphi XE8中的标准库

来做这件事
if Assigned(JSONValue) then
    case JSONValue.ValueType of
      jsArray  : ProcessArrayResponse(JSONValue as TJSONArray);
      jsObject : ProcessObjectResponse(JSONValue as TJSONObject);
    end;
end;

(此示例来自https://github.com/deltics/delphi.libs/wiki/JSON但使用Deltics.JSON库。)

有人知道如何使用标准库吗?

谢谢

3 个答案:

答案 0 :(得分:3)

您可以使用is运算符:

if Assigned(JSONValue) then
begin
  if JSONValue is TJSONArray then
    ProcessArrayResponse(TJSONArray(JSONValue))
  else if JSONValue is TJSONObject then
    ProcessObjectResponse(TJSONObject(JSONValue));
end;

如果您想使用case语句,则必须创建自己的查找:

type
  JsonValueType = (jsArray, jsObject, ...);

function GetJsonValueType(JSONValue: TJSONValue): JsonValueType;
begin
  if JSONValue is TJSONArray then Exit(jsArray);
  if JSONValue is TJSONObjct then Exit(jsObject);
  ...
end;

...

if Assigned(JSONValue) then
begin
  case GetJsonValueType(JSONValue) of
    jsArray  : ProcessArrayResponse(TJSONArray(JSONValue));
    jsObject : ProcessObjectResponse(TJSONObject(JSONValue));
  end;
end;

或者:

type
  JsonValueType = (jsArray, jsObject, ...);

var
  JsonValueTypes: TDictionary<String, JsonValueType>;

...

if Assigned(JSONValue) then
begin
  case JsonValueTypes[JSONValue.ClassName] of
    jsArray  : ProcessArrayResponse(TJSONArray(JSONValue));
    jsObject : ProcessObjectResponse(TJSONObject(JSONValue));
  end;
end;

...

initialization
  JsonValueTypes := TDictionary<String, JsonValueType>.Create;
  JsonValueTypes.Add('TSONArray', jsArray);
  JsonValueTypes.Add('TSONObject', jsObject);
  ...
finalization
  JsonValueTypes.Free;

答案 1 :(得分:2)

使用is运算符区分可能的值类型。所以,

var
  obj: TJSONObject;
  arr: TJSONArray;
....
if JSONValue is TJSONObject then
  obj := TJSONObject(JSONValue)
else if JSONValue is TJSONArray then
  arr := TJSONArray(JSONValue)
else
  // other possible types are TJSONNumber, TJSONString, TJSONTrue, TJSONFalse, TJSONNull

答案 2 :(得分:0)

我做了一些测试并找到了这种方式(似乎工作我正在测试它)

FData : TJSONArray;

...

if JSONValue is TJSONObject then
   FData := TJSONArray(JSONValue as TJSONObject)
else if JSONValue is TJSONArray then
   FData := JSONValue as TJSONArray
else if JSONValue is TJSONString then
   FData := nil;