0

我需要准备 JSON 并将其发送到网站。我正在使用TJSONObject. 我的代码很简单:

procedure TForm1.Button1Click(Sender: TObject);
var 
  JsonArray,JsonArray1:TJSONArray;
  F,F1:TJSONObject;
begin
  FJSONObject.AddPair('api_password','password');
  FJSONObject.AddPair('method','POST');

  F:=TJSONObject.Create;
  F.AddPair('nest1','v1');
  F.AddPair('nest2','v2');
  JsonArray:=TJSONArray.Create;
  JsonArray.AddElement(F);
  FJSONObject.AddPair('Main array',JsonArray);
end;

结果,我得到了这个 JSON:

{
  "api_password": "password",
  "method": "POST",
  "Main array": [
    {
      "nest1": "v1",
      "nest2": "v2"
    }
  ]
}

但是,根据网站的 API,我需要发送这个 JSON:

{
  "api_password": "password",
  "method": "POST",
  "Main array": [
    {
      \"nest1\": \"v1\",
      \"nest2\": \"v2\"
    }
  ]
}

我怎样才能制作这个 JSON?

4

1 回答 1

2

JsonArray您需要添加一个字符串,而不是添加一个对象。此时,当从 生成字符串时FJSONObject,它会自动将所有替换"\"。但是,这仅在F不包含任何时才有效",否则F.ToString必须替换为F.ToString.Replace ('\"', '"' )。您还需要处理F生命周期,因为它不再由FJSONObject.

procedure TForm1.Button1Click(Sender: TObject);
var
  JsonArray : TJSONArray;
  F : TJSONObject;
begin
  FJSONObject.AddPair('api_password', 'password');
  FJSONObject.AddPair('method', 'POST');
  F := TJSONObject.Create;
  try
    F.AddPair('nest1', 'v1');
    F.AddPair('nest2', 'v2');
    JsonArray := TJSONArray.Create;
    JsonArray.Add(F.ToString);
    FJSONObject.AddPair('Main array', JsonArray);
  finally
    F.Free;
  end;
end;

不幸的是,您想要的不是标准的 JSON 格式,而且您无法轻松生成它。如果你添加一个字符串到FJSONObject,它会被自动处理为"。如果直接添加数组,则数组的所有元素都相同。所以总有一些东西需要手动替换,在生成结果时,你也需要使用这一行。

FJSONObject.ToString.Replace('["{', '[{').Replace('}"]', '}]')
于 2018-05-17T13:42:44.107 回答