You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Delphi TJSONObject生成含转义引号嵌套JSON的方法

解决Delphi TJSONObject生成带转义引号的JSON问题

你遇到的核心问题是:网站API要求数组中的元素不是标准JSON对象,而是一个JSON格式的字符串(内部引号被转义),而非常规的嵌套JSON结构。你的原代码直接将JSON对象加入数组,生成的是标准嵌套结构,不符合API要求。

修改思路

需要先将内部的TJSONObject序列化为字符串,再把这个字符串作为数组元素添加。Delphi的JSON库会自动处理字符串中的引号转义,刚好满足API的格式要求。

修改后的完整代码

procedure TForm1.Button1Click(Sender: TObject);
var
  JsonArray: TJSONArray;
  F, FJSONObject: TJSONObject;
begin
  // 初始化外层JSON对象
  FJSONObject := TJSONObject.Create;
  try
    FJSONObject.AddPair('api_password', 'password');
    FJSONObject.AddPair('method', 'POST');

    // 创建内部需要转义的JSON对象
    F := TJSONObject.Create;
    try
      F.AddPair('nest1', 'v1');
      F.AddPair('nest2', 'v2');

      // 创建数组,并将内部对象转为字符串后添加(关键修改)
      JsonArray := TJSONArray.Create;
      try
        // 将内部对象序列化为字符串,用TJSONString包装后加入数组
        JsonArray.Add(TJSONString.Create(F.ToString));
        FJSONObject.AddPair('Main array', JsonArray);

        // 可在这里输出或发送生成的JSON
        ShowMessage(FJSONObject.ToString);
      finally
        JsonArray.Free;
      end;
    finally
      F.Free; // 数组存的是字符串,内部对象可安全释放
    end;
  finally
    FJSONObject.Free;
  end;
end;

关键修改说明

  1. 替换数组元素类型:将原代码的JsonArray.AddElement(F)改为JsonArray.Add(TJSONString.Create(F.ToString)),把内部JSON对象转为字符串后作为数组元素,而非直接添加对象。
  2. 修复内存管理问题:补充了完整的try-finally块,避免JSON对象内存泄漏;同时修正了原代码中FJSONObject未初始化的错误。
  3. 自动转义处理:通过TJSONString包装字符串后,Delphi会自动对字符串内部的引号进行转义,生成API要求的\"格式。

生成的JSON结果

运行上述代码后,生成的JSON将完全符合网站API要求:

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

内容的提问来源于stack exchange,提问作者Dmytro Lendel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:07:32