使用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;
关键修改说明
- 替换数组元素类型:将原代码的
JsonArray.AddElement(F)改为JsonArray.Add(TJSONString.Create(F.ToString)),把内部JSON对象转为字符串后作为数组元素,而非直接添加对象。 - 修复内存管理问题:补充了完整的
try-finally块,避免JSON对象内存泄漏;同时修正了原代码中FJSONObject未初始化的错误。 - 自动转义处理:通过
TJSONString包装字符串后,Delphi会自动对字符串内部的引号进行转义,生成API要求的\"格式。
生成的JSON结果
运行上述代码后,生成的JSON将完全符合网站API要求:
{ "api_password": "password", "method": "POST", "Main array": [ "{\"nest1\":\"v1\",\"nest2\":\"v2\"}" ] }
内容的提问来源于stack exchange,提问作者Dmytro Lendel
相关产品推荐
相关产品推荐

