【发布时间】:2019-08-18 17:26:33
【问题描述】:
我有与Delphi parse JSON array or array 类似的问题,但答案不符合我的需要。
我有这个 JSON:
[
{
"total": "9",
"page": "9",
"records": "99",
"rows": [
{
"id": "62316",
"titleId": "47243",
"subject": [
"000607",
"000607_",
"001727"
],
"keyFeatures": [
"AI",
"URL"
]
},
{
"id": "66",
"titleId": "47243",
"subject": [
"000607",
"000607_",
"001727"
],
"keyFeatures": [
"KK"
]
}
],
"suggestion": "90"
}
]
我想写所有 f.e.备忘录中每个“id”的“keyFeatures”,如下所示:
1: 62316 KeyFeatures: AI,URL 2:66 关键特征:KKprocedure TIFForm1.ParseJson(StrJson: string);
var
LJsonArr: TJSONArray;
LJsonArrRow: TJSONArray;
vJSONObject: TJSONObject;
vJSONPair: TJSONPair;
vJSONObjectKF: TJSONObject;
vJSONPairKF: TJSONPair;
vJasonArrRows: TJSONArray;
vJSONValue: TJSONValue;
LJSONAttribute: String;
LJSONKF_key: String;
LJSONValue: String;
i: integer;
begin
LJsonArr := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson), 0) as TJSONArray;
if LJsonArr <> nil then
try
// rows
vJasonArrRows := LJsonArr as TJSONArray;
for vJSONValue in vJasonArrRows do
begin
i := i + 1;
vJSONObject := vJSONValue as TJSONObject;
vJSONPair := vJSONObject.get('id');
LJSONAttribute := vJSONPair.JsonString.Value;
vJSONValue := vJSONPair.JsonValue.Value;
vJSONObjectKF := vJSONValue as TJSONObject;
vJSONPairKF := vJSONObject.Get('keyFeatures');
LJSONKF_key := vJSONPairKF.JsonString.Value;
// How can I here merge all keyFeatures together with , separated?
//Edit: My Serializer
rowresult.KeyFeatures := serialize(vJSONObject, 'keyFeatures');
Memo5.Lines.Add(Format('%d: %s KeyFeatures: %s', [i, rowresult.id, rowresult.keyFeatures]));
end;
finally
LJsonArr.Free;
end;
end;
此外,如果我可以询问 JSON 元素的类型,那将很方便。 这是一个带有 keyFeatures 的示例,它又是一个 JSON 数组。但是可能还有更多未知的命名 JSON 键,它们也是数组,这些也应该写在备忘录中。有解决办法吗?
编辑: 在 DP Answer 的帮助下,我已经解决了这个问题,请看下面。
function TIFForm1.serialize(MyJSONObject: TJSONObject; keystring: string): string;
var
KeyFeatures: TJSONValue;
FeatureList: TStringList;
FeatureItem: TJSONValue;
begin
KeyFeatures := (MyJSONObject as TJSONObject).GetValue(keystring);
if KeyFeatures is TJSONArray then
begin
FeatureList := TStringList.Create;
try
for FeatureItem in TJSONArray(KeyFeatures) do
FeatureList.Add(FeatureItem.Value);
Result := FeatureList.CommaText;
finally
FeatureList.Free;
end;
end
else
begin
Result := KeyFeatures.Value;
end;
end;
【问题讨论】:
-
首先编写代码来读取一个简单的 JSON 标量数组。一旦掌握了这一点,就可以学习阅读 JSON 对象。然后将两者放在一起。在你会走路之前不要尝试跑步。
-
我更喜欢通过例子来学习,如果你知道我的程序的变化为什么你不提供tve费用代码行,最好
-
所以通过例子来学习。查找符合我在上面评论中概述的示例。
-
@Remy Lebeau 感谢您编辑我的帖子。