我正在尝试实现一个返回包含类元素的json对象的函数.这是我的功能:
procedure ListToJson(AInputList: TList<TRating>;
AResponse: TJSONObject);
var
i: Integer;
jsonPair: TJSONPair;
jsonObject: TJSONObject;
jsonArray: TJSONArray;
begin
jsonArray := TJSONArray.Create();
jsonObject := TJSONObject.Create();
jsonPair := TJSONPair.Create('ratings', jsonArray);
for i := 0 to AInputList.Count - 1 do
begin
jsonObject.AddPair(TJSONPair.Create('idrating', IntToStr(AInputList[i].IdRating)));
jsonObject.AddPair(TJSONPair.Create('idmark', IntToStr(AInputList[i].IdMark)));
jsonObject.AddPair(TJSONPair.Create('value', IntToStr(AInputList[i].Value)));
jsonObject.AddPair(TJSONPair.Create('description', AInputList[i].Description));
jsonObject.AddPair(TJSONPair.Create('timeposted', FormatDateTime('yyyy-mm-dd hh:mm:ss', AInputList[i].TimePosted)));
jsonArray.AddElement(jsonObject);
end;
AResponse.AddPair(jsonPair);
end;
Run Code Online (Sandbox Code Playgroud)
当我用包含两个元素的列表测试它时,返回的字符串是:
{
"ratings":[{
"idrating":"1",
"idmark":"0",
"value":"0",
"description":"",
"timeposted":"2015-07-29 11:25:03",
"idrating":"2",
"idmark":"0",
"value":"0",
"description":"",
"timeposted":"2015-07-29 11:25:24"
},{
"idrating":"1",
"idmark":"0",
"value":"0",
"description":"",
"timeposted":"2015-07-29 11:25:03",
"idrating":"2",
"idmark":"0",
"value":"0",
"description":"",
"timeposted":"2015-07-29 11:25:24"
}]
}
Run Code Online (Sandbox Code Playgroud)
我尝试在每次循环迭代后删除所有对:
procedure ListToJson(AInputList: TList<TRating>;
AResponse: TJSONObject);
var
i: Integer;
jsonPair: TJSONPair;
jsonObject: TJSONObject;
jsonArray: TJSONArray;
begin
jsonArray := TJSONArray.Create();
jsonObject := TJSONObject.Create();
jsonPair := TJSONPair.Create('ratings', jsonArray);
for i := 0 to AInputList.Count - 1 do
begin
jsonObject.AddPair(TJSONPair.Create('idrating', IntToStr(AInputList[i].IdRating)));
jsonObject.AddPair(TJSONPair.Create('idmark', IntToStr(AInputList[i].IdMark)));
jsonObject.AddPair(TJSONPair.Create('value', IntToStr(AInputList[i].Value)));
jsonObject.AddPair(TJSONPair.Create('description', AInputList[i].Description));
jsonObject.AddPair(TJSONPair.Create('timeposted', FormatDateTime('yyyy-mm-dd hh:mm:ss', AInputList[i].TimePosted)));
jsonArray.AddElement(jsonObject);
jsonObject.RemovePair('idrating');
jsonObject.RemovePair('idmark');
jsonObject.RemovePair('value');
jsonObject.RemovePair('description');
jsonObject.RemovePair('timeposted');
end;
AResponse.AddPair(jsonPair);
end;
Run Code Online (Sandbox Code Playgroud)
而输出是一个数组,其中n(列表元素的数量)为空对象: {"ratings":[{},{}]}
我正在尝试构建的json应该像:
{
"ratings":[{
"idrating":"1",
"idmark":"0",
"value":"0",
"description":"",
"timeposted":"2015-07-29 11:25:03"
},{
"idrating":"2",
"idmark":"0",
"value":"0",
"description":"",
"timeposted":"2015-07-29 11:25:24"
}]
}
Run Code Online (Sandbox Code Playgroud)
你有一个jsonObject,所以每当你把它添加到数组时,它重复的状态就会重复.
在循环中构造jsonObject,然后您将在数组中拥有不同的对象.
for i := 0 to AInputList.Count - 1 do
begin
jsonObject := TJSONObject.Create();
jsonObject.AddPair(TJSONPair.Create('idrating', IntToStr(AInputList[i].IdRating)));
jsonObject.AddPair(TJSONPair.Create('idmark', IntToStr(AInputList[i].IdMark)));
jsonObject.AddPair(TJSONPair.Create('value', IntToStr(AInputList[i].Value)));
jsonObject.AddPair(TJSONPair.Create('description', AInputList[i].Description));
jsonObject.AddPair(TJSONPair.Create('timeposted', FormatDateTime('yyyy-mm-dd hh:mm:ss', AInputList[i].TimePosted)));
jsonArray.AddElement(jsonObject);
end;
Run Code Online (Sandbox Code Playgroud)
或者,您可以定义一个函数以从TRating创建TJSONObject,并在循环中使用它
function TRatingToJSON( Rating: TRating ): TJSONObject;
begin
Result := TJSONObject.Create();
Result.AddPair(TJSONPair.Create('idrating', IntToStr(Rating.IdRating)));
Result.AddPair(TJSONPair.Create('idmark', IntToStr(Rating.IdMark)));
Result.AddPair(TJSONPair.Create('value', IntToStr(Rating.Value)));
Result.AddPair(TJSONPair.Create('description', Rating.Description));
Result.AddPair(TJSONPair.Create('timeposted', FormatDateTime('yyyy-mm-dd hh:mm:ss', Rating.TimePosted)));
end;
procedure ListToJson(AInputList: TList<TRating>;
AResponse: TJSONObject);
var
i: Integer;
jsonArray: TJSONArray;
begin
jsonArray := TJSONArray.Create();
for i := 0 to AInputList.Count - 1 do
begin
jsonArray.AddElement(TRatingToJSON(AInputList[i]));
end;
AResponse.AddPair(TJSONPair.Create('ratings', jsonArray));
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11698 次 |
| 最近记录: |