0

我想用 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 库)。

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

谢谢你

4

3 回答 3

4

您可以使用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;
于 2015-05-29T19:47:46.240 回答
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
于 2015-05-29T19:31:45.987 回答
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;
于 2015-05-29T19:20:10.883 回答