Delphi Alexandria获取JSON响应时正斜杠被加反斜杠转义如何解决
问题背景
在JSON响应处理场景中,Delphi Alexandria版本下使用REST组件获取接口返回时,字符串内包含的正斜杠字符会被自动添加前置反斜杠转义,相同代码在Delphi Berlin版本运行无该异常。
获取API响应的代码如下:
procedure GetJSONInformation; var objResponse : TRESTResponse; objClient : TRESTClient; objRequest : TRESTRequest; sJSONResponse : string; begin objResponse := TRESTResponse.Create(nil); objClient := TRESTClient.Create(nil); objClient.Accept := 'application/json, text/plain; q=0.9, text/html;q=0.8,'; objClient.AcceptCharset := 'UTF-8, *;q=0.8'; objRequest := TRESTRequest.Create(nil); objRequest.Method := rmGET; objRequest.Accept := 'application/json, text/plain; q=0.9, text/html;q=0.8,'; objRequest.AcceptCharset := 'UTF-8, *;q=0.8'; objRequest.Client := objClient; objRequest.Response:= objResponse; try objClient.BaseURL := 'https://sample.net'; ObjRequest.Resource := 'api/GetInformation/{Param1}/{Param2}'; ObjRequest.AddParameter('Param1', 'Parameter1', TRESTRequestParameterKind.pkURLSEGMENT); ObjRequest.AddParameter('Param2', 'Parameter2', TRESTRequestParameterKind.pkURLSEGMENT); ObjRequest.Execute; if ObjResponse.StatusCode = 200 then sJSONResponse:= ObjResponse.JsonText; // 此处获取到带多余转义的JSON响应 finally FreeAndNil(objRequest); FreeAndNil(objClient); FreeAndNil(objResponse); end; end;
异常表现
接口实际返回带多余转义的内容片段:
"Date": "04\/13\/2022", "stringdata": "DEC\/ACB test",
预期的正确返回内容片段:
"Date": "04/13/2022", "stringdata": "DEC/ACB test",
解决方案
该问题是Alexandria版本内置JSON序列化逻辑默认开启了正斜杠转义规则导致,可通过以下三种方案修复,优先选择前两种:
- 方案1:直接获取原始响应内容,不使用重新序列化后的
JsonText属性。将赋值行替换为读取Content属性,该属性返回接口原始返回的未加工文本,不会被组件额外添加转义符:sJSONResponse := ObjResponse.Content; - 方案2:修改JSON写入器配置,关闭正斜杠转义。执行请求前添加如下配置(需引用
System.JSON单元),即可让JsonText输出结果和旧版本行为一致:objResponse.JSONWriterOptions.EscapeSolidus := False; - 方案3:兜底字符串替换。如果不方便调整前两处逻辑,可在获取到响应文本后全局替换转义组合:
注意:该方案为兼容处理,仅在前两种方案无法落地时使用,极端场景下可能误替换JSON中合法的转义组合。sJSONResponse := StringReplace(sJSONResponse, '\/', '/', [rfReplaceAll]);
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

