Delphi中的Json和System.JSON

Jas*_*n-X 2 delphi json

我有这个杰森

{
  "Sucess": true,
  "Msg": "OK",
  "Ret": {
    "First": 0,
    "Next": true,
    "Total": 60,
    "Itens": [
      {
        "ID": 212121,
        "Name": "uuuuuuuuuuuuuuuuuuuuuuuu",
        "LcID": 9898,
        "Oclao": false,
        "Lal": {
          "ID": 12202,
          "Name": "pppppppppppppppppp",
          "Pais": "Brasil",
          "Dtc": 0.0
        },
        "Subtipo": {
          "ID": 7458,
          "Desc": "mnmnmnmnn"
        },
        "Tipo": {
          "Sit": "cor1",
          "Sitrm": 0,
          "Name": "Shsdfow"
        },
        "Qtde": 0,
        "Qntcoes": 0,
        "Pubum": "adfsdfsdfs",
        "Evias": {
          "arq": {
            "Mo": [
              "site.com"
            ],
            "Moir": [
              "site.com"
            ]
          }
        }
      },
      {
        "ID": 9797878,
        "Name": "uuuuuuuuuuuuuuuuuuuuuuuu",
        "LcID": 9898,
        "Oclao": false,
        "Lal": {
          "ID": 12332,
          "Name": "pppppppppppppppppp",
          "Pais": "Brasil",
          "Dtc": 0.0
        },
        "Subtipo": {
          "ID": 7458,
          "Desc": "mnmnmnmnn"
        },
        "Tipo": {
          "Sit": "cor1",
          "Sitrm": 0,
          "Name": "Shsdfow"
        },
        "Qtde": 0,
        "Qntcoes": 0,
        "Pubum": "adfsdfsdfs",
        "Evias": {
          "arq": {
            "Mo": [
              "site.com"
            ],
            "Moir": [
              "site.com"
            ]
          }
        }
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我只能按以下方式获取第一个项目“ Sucess,Msg和Ret”的值

var
 JSONValue, jv: TJSONValue;
 joName: TJSONObject;
 data: TBytes;
 sHtmlResp, sTemp : String;
begin
  sHtmlResp := '[' + sHtmlResp + ']';
  data := TEncoding.ASCII.GetBytes(sHtmlResp);
  JSONValue := TJSONObject.ParseJSONValue(data, 0);
  for jv in JSONValue as TJSONArray do
   begin
    joName := jv as TJSONObject;
    sTemp:= joName.Get('Msg').JSONValue.Value;
   end;
end;
Run Code Online (Sandbox Code Playgroud)

sHtmlResp包含字符串json。

我尝试了一些其他方法来获取最不成功的字段,如何获得“ Ret”,“ Items”等子项目。

一个细节,必须在我得到的JSON字符串中添加'['']',否则我什至无法获得第一个字段。

谢谢!

Rem*_*eau 5

Ret是子对象,因此您需要这样访问它。它具有自己的值和子对象数组,依此类推。

尝试这个:

var
 joName, joRet, joItem: TJSONObject;
 joItems: TJSONArray;
 sHtmlResp, sMsg: String;
 bSuccess: Boolean;
begin
  sHtmlResp := ...; // original JSON without added braces around it
  joName := TJSONObject.ParseJSONValue(sHtmlResp) as TJSONObject;

  bSuccess := joName.GetValue('Success') is TJSONTrue;
  // if you are using Delphi 10 Seattle or later, you can use this instead:
  // bSuccess := (joName.GetValue('Success') as TJSONBool).AsBoolean;

  sMsg := joName.GetValue('Msg').Value;

  joRet := joName.GetValue('Ret') as TJSONObject;
  // use joRet.GetValue() as needed ...

  joItems := joRet.GetValue('Itens') as TJSONArray;
  for i := 0 to joItems.Count-1 do
  begin
    joItem := joItems.Items[i] as TJSONObject;
    // use joItem.GetValue() as needed ...
  end;
end;
Run Code Online (Sandbox Code Playgroud)