【发布时间】:2018-03-14 00:37:44
【问题描述】:
这是我希望能够解析的示例 JSON:
[
{
"a":{
"username":"aaa",
"email":"aaa@gmail.com"
}
},
{
"b":{
"username":"bbb",
"email":"bbb@gmail.com"
}
}
]
我需要对getData('b', 'email') 的调用必须输出bbb@gmail.com!
我真的很难理解如何使用System.JSON 单元,但我无法得到解决方案!我希望能够编写一个从上述 JSON 结构中提取特定数据的函数。到目前为止,这是我的代码。在类构造函数中我有:
var
FIds: TJSONArray;
begin
FIds := TJSONObject.ParseJSONValue({json string here}) as TJSONArray;
end;
然后,在必须返回数据的函数内部,我写了这个:
// 'name' can be 'a' or 'b' | 'data' can be 'username' or 'email'
function TTest.getData(const name, data: string): string;
var
FValue, FValueInner: TJSONValue;
begin
for FValue in Fids do
begin
if (FValue is TJSONArray) then
begin
//Here I am sure that I have a TJSONArray (which can be 'a' or 'b' from above)
end;
end;
end;
根据我上面写的,我必须检查name 的值并决定是否必须访问a 或b 中的数据。然后,一旦我选择了正确的 JSON 数组 a 或 b,我必须选择是否要显示 username 或 email 字段(在 data 变量中指定)。
我该怎么做?
这是我最近的尝试,但我真的不明白该怎么做:
... same code above ...
if (FValue is TJSONArray) then
begin
//here I want to check if the current array is a or b
if ((FValue as TJSONArray).Items[0] as TJSONValue).Value = name then
begin
Farr := TJSONObject.ParseJSONValue(((FValue as TJSONArray).Items[0] as TJSONValue).ToJSON) as TJSONArray;
try
//here I want to get the data inside username or email
for FValueInner in Farr do
Result := FValueInner.GetValue<string>(data);
finally
Farr.Free;
end;
end;
end;
Farr: TJSONArray; 和 FValueInner: TJSONValue; 在哪里
【问题讨论】:
-
不是答案,但我很久以前就放弃了使用内置库,而是改用
XSuperObject。它非常易于使用且非常轻巧。 -
@JerryDodge 也许你就是答案。实际上,我在文档上读到有 3 种读取 JSON 的方法,我试图理解一些东西,但我根本不喜欢它们,而且我也发现它们很难理解。我不想放弃,但我肯定会寻找那个 XSuperObject 是否更容易!
-
@RaffaeleRossi 在我看来,问题似乎在于您对 JSON 的总体理解,而不是 System.JSON 单元。根据您所写的内容,您将“a”和“b”视为数组,但它们是对象而不是数组!数组以 [ ] 开头,但对象以 { } 开头。如果你理解这一点,你会发现图书馆一点也不难;)
-
没有反对这个问题,但我现在又感到困惑了。 “Delphi 解析 JSON 数组或数组” 如何比特定主题提问更易于搜索?我认为没有理由关闭甚至删除它,因为它是可以理解且可以回答的问题(因此有些问题已被关闭并从此处删除)。
-
花点时间在json.org 学习术语