用Delphi构建JSON

bob*_*ski 2 delphi json

我正在尝试实现一个返回包含类元素的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)

Cal*_*eth 6

你有一个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)