【问题标题】:Build JSON with Delphi使用 Delphi 构建 JSON
【发布时间】:2015-07-29 11:06:46
【问题描述】:

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

当我使用包含两个元素的列表对其进行测试时,返回的字符串是:

{
  "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"
  }]
} 

我尝试在每次循环迭代后删除所有对:

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;

输出是一个包含 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"
  }]
}

【问题讨论】:

标签: json delphi


【解决方案1】:

您有一个 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;

或者,您可以定义一个函数来从 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;

【讨论】:

    【解决方案2】:

    是我,还是那真的很丑(和codous,或者很多代码的用词是什么)。因为我真的(真的)讨厌看到各种类型的长长的重载列表,并且真的(真的)喜欢Variant 类型,所以我创建了jsonDoc,它看起来像这样:

    var
      x:array of OleVariant;
      i:integer;
    begin
      SetLength(x,AInputList.Count);
      for i:=0 to AInputListCount-1 do
        x[i]:=JSON(
          ['idrating',AInputList[i].IdRating
          ,'idmark',AInputList[i].IdMark
          ,'value',AInputList[i].Value
          ,'description',AInputList[i].Description
          ,'timeposted',FormatDateTime('yyyy-mm-dd hh:mm:ss', AInputList[i].TimePosted)//VarFromDateTime?
          ]);
      end;
      AResponse:=JSON(['ratings',VarArrayOf(x)]);
    

    【讨论】:

      【解决方案3】:

      找到解决方法:

      procedure ListToJson(AInputList: TList<TRating>;
        AResponse: TJSONObject);
      var
        i: Integer;
        jsonPair: TJSONPair;
        jsonObject: TList<TJSONObject>;
        jsonArray: TJSONArray;
      begin
        jsonArray := TJSONArray.Create();
        jsonObject := TList<TJSONObject>.Create;
        jsonPair := TJSONPair.Create('ratings', jsonArray);
      
        try
          for i := 0 to AInputList.Count - 1 do
          begin
            jsonObject.Add(TJSONObject.Create());
      
            jsonObject.Last.AddPair(TJSONPair.Create('idrating', IntToStr(AInputList[i].IdRating)));
            jsonObject.Last.AddPair(TJSONPair.Create('idmark', IntToStr(AInputList[i].IdMark)));
            jsonObject.Last.AddPair(TJSONPair.Create('value', IntToStr(AInputList[i].Value)));
            jsonObject.Last.AddPair(TJSONPair.Create('description', AInputList[i].Description));
            jsonObject.Last.AddPair(TJSONPair.Create('timeposted', FormatDateTime('yyyy-mm-dd hh:mm:ss', AInputList[i].TimePosted)));
      
            jsonArray.AddElement(jsonObject.Last);
          end;
      
        AResponse.AddPair(jsonPair);
      finally
        jsonObject.Free;
      end;
      

      结束;

      【讨论】:

      • 这得到了一个工作结果,并没有真正理解出了什么问题,也没有解释自己
      猜你喜欢
      • 2016-10-06
      • 2012-08-15
      • 2011-12-25
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      相关资源
      最近更新 更多