Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确解析以下包含数组的JSON文档_Json_Delphi_Delphi Xe5 - Fatal编程技术网

如何正确解析以下包含数组的JSON文档

如何正确解析以下包含数组的JSON文档,json,delphi,delphi-xe5,Json,Delphi,Delphi Xe5,JSON文档: {"asks": [["0.01129999",0.9997237],["0.01130000",594.26412711],["0.01130826",0.23004724],["0.01130999",0.25231793]], "bids": [["0.01129800",174.30861783],["0.01128867",0.13287659],["0.01128817",0.0097447],["0.01127559",241.94881004]]

JSON文档:

{"asks":
    [["0.01129999",0.9997237],["0.01130000",594.26412711],["0.01130826",0.23004724],["0.01130999",0.25231793]],
 "bids":
    [["0.01129800",174.30861783],["0.01128867",0.13287659],["0.01128817",0.0097447],["0.01127559",241.94881004]],
 "isFrozen":"0","seq":254407265
}
这是我第一次使用JSON文档。我尽可能做到了。它起作用了。但我认为这是错误的方式。因为在我的实现中缺少TJSONPair类,这与net中的许多示例不同。在我的案例中,是否有其他包含TJSONPair的实现变体

const
  ArrString : array[0..1] of String = ('asks','bids');
var
  JSONObject: TJSONObject;
  JSONArray: TJSONArray;
  i,j: integer;
...

  JSONObject:=TJSONObject.ParseJSONValue(JSONString) as TJSONObject;
  if Assigned(JSONObject) then
    begin
    for i := 0 to High(ArrString) do
      begin
        JSONArray :=  JSONObject.Get(ArrString[i]).JsonValue as TJSONArray;
        for j := 0 to JSONArray.Size-1 do
          begin
            if j = 0 then  Memo1.Lines.Add(ArrString[i]+':');
            Memo1.Lines.Add(TJSONString(TJSONArray(JSONArray.Get(j)).Get(0)).Value+ ' ' +TJSONNumber(TJSONArray(JSONArray.Get(j)).Get(1)).ToString);
          end;
      end;

我建议您不要使用内置的JSON类,而是使用Henry Gourvest提供的优秀类。它们存在的时间更长,测试更好,功能更强大,使用更方便

有了这些,您的代码将变成:

procedure ParseJSON(const JSONString: string);
  const ArrString: array of string = ['asks', 'bids'];
  var JSON, Element: ISuperObject;
      CurrentString: string;
begin
  JSON := SO(JSONString);
  for CurrentString in ArrString do
  begin
    Memo1.Lines.Add(CurrentString + ':');
    for Element in JSON[CurrentString] do
      Memo1.Lines.Add(Element.AsArray.S[0] + ' ' + Element.AsArray.D[1].ToString);
  end;
end;

迭代最里面的数组时,
Get(1)
不会返回
TJSONString
,而是返回
TJSONNumber
。如果您将
用作
强制转换,则会检测到该错误。您应该使用
TJSONArray.Items[]
而不是
TJSONArray.Get()
。这里肯定有一个类。您是对的,
Get(1)
return
TJSONNumber
,谢谢您的提示。关于
TJSONArray.Items[]
,我可能弄错了,但是在
Get
重放了XE2
Items
之后。我使用的XE5中的
TJSONArray
中没有
项<当JSON类被移动到新的
System.JSON
单元时,在XE6中添加了code>TJSONArray.Items
。“警告:
Get
已弃用。请使用