我有一个与Delphi 解析 JSON array 或 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"
}
]
我想在备忘录中写下每个“id”的所有 fe“keyFeatures”,如下所示:
1: 62316 KeyFeatures: AI,URL 2: 66 KeyFeatures: KK
procedure 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;
Delphipraxis DP 的一个好人提供了一个非常复杂的解决方案:
procedure TForm1.Button1Click(Sender: TObject);
var
DataBase: String;
JsonArray: TJSONArray;
ArrayElement: TJSonValue;
RowValue: TJSonValue;
RowItem: TJSonValue;
keyFeatures: TJSonValue;
FeatureItem: TJSonValue;
FeatureList: TStringlist;
Id: Integer;
Index: Integer;
begin
Memo1.Clear;
DataBase :=
'[{"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"}]';
JsonArray := TJSonObject.ParseJSONValue(DataBase) as TJSONArray;
try
Index := 1;
for ArrayElement in JsonArray do
begin
RowValue := (ArrayElement as TJSonObject).GetValue('rows');
if RowValue is TJSONArray
then
begin
for RowItem in TJSONArray(RowValue) do
begin
RowItem.TryGetValue('id', Id);
keyFeatures := (RowItem as TJSonObject).GetValue('keyFeatures');
if keyFeatures is TJSONArray
then
begin
FeatureList := TStringlist.Create;
try
for FeatureItem in TJSONArray(keyFeatures) do
FeatureList.Add(FeatureItem.Value);
Memo1.Lines.Add(Format('%d: %d KeyFeatures: %s', [Index, Id, FeatureList.CommaText]));
finally
FeatureList.Free;
end;
end;
end;
end;
inc(Index);
end;
finally
JsonArray.Free;
end;
end;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句