Delphi从json对象访问数据

时间:2016-06-17 16:31:25

标签: json delphi

我需要编写一些代码来从我的应用程序将从网站收到的JSON字符串中检索数据。

这是JSON字符串。

{
  "client" :
     {
      "Name" : "john doe",
      "Phone" : 12345678,
      "Address": "5th av",
     },
  "order" : [
     {
      "Code" : 101,
      "Quantity" : 1,
      "Cost": 10.50,
      "Coment" : ""
     },
     {
      "Code" : 102,
      "Quantity" : 3,
      "Cost": 8.50,
      "Coment" : ""
     },
     {
      "Code" : 103,
      "Quantity" : 1,
      "Cost": 21.50,
      "Coment" : ""
     }
  ]
}

我对如何读取对和数组感到非常困惑。我在这里和其他论坛上尝试了很多代码,但我仍然无法完成它。

任何人都可以给我一些提示来完成它吗?我正在使用XE5和JSON单元。

2 个答案:

答案 0 :(得分:4)

我不打算给你写实际的代码,但我会给你一个提示。

以下是您展示的JSON的结构:

object
|
|_ client (object)
|  |_ Name (string)
|  |_ Phone (string)
|  |_ Address (string)
|
|_ order (array)
  |_ [0] (object)
  |  |_ Code (number)
  |  |_ Quantity (number)
  |  |_ Code (number)
  |  |_ Coment (string)
  |
  |_ [1] (object)
  |  |_ Code (number)
  |  |_ Quantity (number)
  |  |_ Code (number)
  |  |_ Coment (string)
  |
  |_ [2] (object)
     |_ Code (number)
     |_ Quantity (number)
     |_ Code (number)
     |_ Coment (string)

您可以在Data.DBXJSON单元中将该1对1映射到Delphi的本机JSON类(它们已移至XE6中的System.JSON单元)。

  1. 首先将JSON字符串传递给TJSONObject.ParseJSONValue(),然后返回TJSONValue。将其输入到TJSONObject
  2. 使用其Values属性访问as.POSIXct(interval, format = '%H:%M', tz = 'Pacific/Honolulu')client值。分别将它们输入orderTJSONArray
  3. 对于TJSONObject对象,请使用其client属性访问ValuesNamePhone值。您可以调用他们的Value()方法来获取字符串值。
  4. 对于Address数组,使用其CountItems属性或其GetEnumerator方法(间接位于for..in loop中)来迭代数组项目。将每个项目输入到order以访问其TJSONObject属性。对于数字值,请将其输入TJSONNumber以访问其AsInt,{{根据需要提供3}}和AsInt64属性。
  5. 有关详情,请参阅Embarcadero的AsDouble

答案 1 :(得分:0)

如果您想与json合作,我建议您使用alcinoe。但使用SVN版本是最准确的:svn checkout svn://svn.code.sf.net/p/alcinoe/code/alcinoe-code

不要使用delphi json对象(dbxjson),它非常慢(它们是alcino中的一个演示,比较aljsonDoc / SuperObject / dbxjon,你会看到自己用dbxjson发生的灾难

如何使用

的例子
{
  _id: 1,
  name: { first: "John", last: "Backus" },
  birth: new Date('1999-10-21T21:04:54.234Z'),
  contribs: [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
  awards: [
            { award: "National Medal of Science",
              year: 1975,
              by: "National Science Foundation" },
            { award: "Turing Award",
              year: 1977,
              by: "ACM" }
          ],
  spouse: "",
  address: {},
  phones: []
}

访问文档节点:

MyJsonDoc.loadFromJson(AJsonStr, False);
MyJsonDoc.childnodes['_id'].int32;
MyJsonDoc.childnodes['name'].childnodes['first'].text;
MyJsonDoc.childnodes['name'].childnodes['last'].text;
MyJsonDoc.childnodes['birth'].datetime;
for i := 0 to MyJsonDoc.childnodes['contribs'].ChildNodes.count - 1 do
  MyJsonDoc.childnodes['contribs'].childnodes[i].text;
for i := 0 to MyJsonDoc.childnodes['awards'].ChildNodes.count - 1 do begin
  MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['award'].text;
  MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['year'].text;
  MyJsonDoc.childnodes['awards'].childnodes[i].childnodes['by'].text;
end;

你可以阅读aljsondoc here

的完整文档