如何使用System.JSON实现JSON数组嵌套(REST请求场景)
解决System.JSON生成嵌套JSON数组的问题
我学习JSON仅有几天时间,最终目标是生成用于REST请求的JSON结构,要求nested2数组必须嵌套在nested1数组中。
期望的JSON结构
{ "data": { "1": "str", "2": "str", "3": null, "nested1": [{ "4": 1, "5": "str", "6": "str", "nested2": [{ "7": "str", "8": "str" }] // nested2的闭合括号 }] // nested1的闭合括号 } // 外层data对象的闭合括号 }
生成的错误JSON结构
{ "data": { "1": "str", "2": "str", "3": null, "nested1": [{ "4": 1, "5": "str", "6": "str" }], "nested2": [{ "7": "str", "8": "str" }] } }
要求仅使用System.JSON库解决该问题,以下是我的错误代码:
procedure Tform1.Button1Click(Sender: TObject); var jo1, jo2, jno: TJSONObject; //jno- 用于嵌套对象 ja1,ja2: TJSONArray; jp: TJSONPair; begin //创建JSON对象'data' jo1:= TJSONObject.Create; jo2:= TJSONObject.Create; try jp:= TJSONPair.Create('data',jo2); jo1.AddPair(jp); jo2.AddPair('1',TJSONString.Create('str')); jo2.AddPair('2',TJSONString.Create('str')); jo2.AddPair('3',TJSONString.Create('str')); //创建ja1数组('nested1'),在其中创建空对象并添加嵌套对象(jno)到数组中 ja1:= TJSONArray.Create; ja1.AddElement(TJSONObject.Create); jno:=ja1.Items[pred(ja1.Count)] As TJSONObject; jno.AddPair('4',TJSONString.Create('str')); jno.AddPair('5',TJSONString.Create('str')); jno.AddPair('6',TJSONString.Create('str')); //将ja1数组添加到jo2中 jo2.AddPair('nested1',ja1); //创建ja2数组('nested2'),创建嵌套对象(jno)并添加到ja2数组中 ja2:= TJSONArray.Create; ja2.AddElement(TJSONObject.Create); jno:=ja2.Items[pred(ja2.Count)] As TJSONObject; jno.AddPair('7',TJSONString.Create('str')); jno.AddPair('8',TJSONString.Create('str')); //如何将ja2数组添加到ja1数组中? // jo2.AddPair('nested2',ja2); Memo1.Lines.Text:= jo1.ToString; finally jo1.Free; end;
正确解决方案及代码
实际上“在数组中添加数组”的表述并不准确,正确步骤为:
- 创建数组;
- 创建对象;
- 将对象添加到数组中;
- 添加(对象,数组)键值对。
procedure TfGoodsGroups.Button3Click(Sender: TObject); Var jo1, jo2, jo3, jno1,jno2: TJSONObject; ja1,ja2: TJSONArray; jp: TJSONPair; begin //创建JSON对象'data' jo1:= TJSONObject.Create; jo2:= TJSONObject.Create; try jp:= TJSONPair.Create('data',jo2); jo1.AddPair(jp); jo2.AddPair('1',TJSONString.Create('str')); jo2.AddPair('2',TJSONString.Create('str')); jo2.AddPair('3',TJSONString.Create('str')); ja1:= TJSONArray.Create; jno1:= TJSONObject.Create; ja1.AddElement(jno1); jno1.AddPair('4',TJSONString.Create('str')); jno1.AddPair('5',TJSONString.Create('str')); jno1.AddPair('6',TJSONString.Create('str')); jo2.AddPair('nested1',ja1); ja2:= TJSONArray.Create; jo3:= TJSONObject.Create; ja2.AddElement(jo3); jo3.AddPair('7',TJSONString.Create('str')); jo3.AddPair('8',TJSONString.Create('str')); jno1.AddPair('nested2',ja2); Memo1.Lines.Text:= jo1.ToString; finally jo1.Free; end; end;
内容的提问来源于stack exchange,提问作者basti
相关产品推荐
相关产品推荐

