我需要编写一些代码来从我的应用程序将从网站收到的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单元。
答案 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
单元)。
TJSONObject.ParseJSONValue()
,然后返回TJSONValue
。将其输入到TJSONObject
。Values
属性访问as.POSIXct(interval, format = '%H:%M', tz = 'Pacific/Honolulu')
和client
值。分别将它们输入order
和TJSONArray
。TJSONObject
对象,请使用其client
属性访问Values
,Name
和Phone
值。您可以调用他们的Value()
方法来获取字符串值。Address
数组,使用其Count
和Items
属性或其GetEnumerator
方法(间接位于for..in
loop中)来迭代数组项目。将每个项目输入到order
以访问其TJSONObject
属性。对于数字值,请将其输入TJSONNumber
以访问其AsInt
,{{根据需要提供3}}和AsInt64
属性。有关详情,请参阅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
的完整文档