下面的JSON串:

{
"a":"x=\"a,b\""
}

通过下面代码输出,多了CRLF:

procedure JsonFormatTest;
var jo:TJsonObject;
j:TJson;
begin
jo := TJsonObject.Create;
jo.AddPair('a', 'x="a,b"'); j := TJson.Create;
ShowMessage( j.Format(jo) );
end;

变成这样:

{
"a":"x=\"a,
b\""
}

下面是修正方法:

unit MM.Helpers.REST.Json;

interface

uses
System.Types, System.JSON, REST.Json; type
TJsonHelper = class helper for TJson
public
class function HFormat(AJsonValue: TJsonValue): string;
end; implementation { TJsonHelper } class function TJsonHelper.HFormat(AJsonValue: TJsonValue): string;
var
s: string;
c: char;
EOL: string;
INDENT: string;
LIndent: string;
isEOL: boolean;
isInString: boolean;
isEscape: boolean;
begin
Result := '';
EOL := sLineBreak; // kanteruk: use platform line brake
INDENT := ' ';
isEOL := true;
isInString := false;
isEscape := false;
s := AJsonValue.ToJSON; // kanteruk: fix here
for c in s do
begin
if not isInString and ((c = '{') or (c = '[')) then
begin
if not isEOL then
Result := Result + EOL;
Result := Result + LIndent + c + EOL;
LIndent := LIndent + INDENT;
Result := Result + LIndent;
isEOL := true;
end
else if not isInString and (c = ',') then
begin
isEOL := false;
Result := Result + c + EOL + LIndent;
end
else if not isInString and ((c = '}') or (c = ']')) then
begin
Delete(LIndent, , Length(INDENT));
if not isEOL then
Result := Result + EOL;
Result := Result + LIndent + c + EOL;
isEOL := true;
end
else
begin
isEOL := false;
Result := Result + c;
end;
if not isEscape and (c = '"') then
isInString := not isInString;
isEscape := (c = '\') and not isEscape; // kanteruk: fix here, move this line down
end;
end; end.

Delphi 10.2.3,官方QC地址:https://quality.embarcadero.com/browse/RSP-20404

TJson.format() 输出错误的CRLF的更多相关文章

  1. Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

    在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义 ...

  2. WIN32程序挂钩SetLastError,输出错误描述到控制台

    WIN32程序挂钩SetLastError,输出错误描述到控制台 作者:徐灵甫 一.窗口模式应用程序(GUI)启用控制台的方法为: 步骤 方法 1 启动/关闭控制台 AllocConsole()Fre ...

  3. ubuntu12.04软件中心打开错误和 ubuntu 包管理之“:E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件包的列表或是状态文件。”的解决

    执行ubuntu软讲中心时打不开.老是崩溃,从终端也下载不了软件. 执行包管理的update或者search等等会报错: E: 读错误 - read (5: 输入/输出错误) E: 无法解析或打开软件 ...

  4. rm: 无法删除 "xxxxx.o" : 输入/输出错误.

    rm: 无法删除 "xxxxx.o" : 输入/输出错误. 碰到无法删除的文件,以为完蛋了,要重装. 后面重启一下就可以了

  5. 在进行多次scanf时,printf输出错误

    随便一处代码,经过改正后,输出正确的 ''' #include <stdio.h> int main(){    int T;    scanf("%d",&T ...

  6. Java输出错误信息与调试信息

    创建一个类,在该类的main()主方法中,使用System类中的out和err两个成员变量来完成调试与错误信息的输出. public class PrintErrorAndDebug { public ...

  7. 20200427_ls_正在读取目录_输入/输出错误

    环境: 在Centos7.2上挂载了一个2T的移动硬盘, 使用vim 在移动硬盘中编辑 .sh文件, wq的时候提示出错, 然后清空的文件, 可以正常wq出来 [root@localhost yido ...

  8. qemu:///system 没有连接驱动器可用;读取数据时进入文件终点: 输入/输出错误

    原因 1. KVM的相关包 装少了 2KVM的相关包 重新安装 3 May 31 15:22:55 localhost libvirtd: 2019-05-31 07:22:55.554+0000: ...

  9. [linux] 输入&输出&错误流

    输入&输出&错误流 Linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字分别是0,1,2. 标准 数字 含义 STDIN 0 标准输入,默认从键盘读 ...

随机推荐

  1. java web项目去除项目名称访问设置方法及tomcat的<Host>标签讲解

    本文为博主原创,未经允许不得转载. 在集群项目中,为了方便用户可以更快捷的访问,即只需要输入IP和端口号,就可以直接访问项目,因为 模块比较多,记住项目名称并不容易,所以在网上查看和学习了下设置的方法 ...

  2. POJ 1011 Sticks(dfs+剪枝)

    http://poj.org/problem?id=1011 题意:若干个相同长度的棍子被剪成若干长度的小棍,求每根棍子原来的可能最小长度. 思路:很经典的搜索题. 我一开始各种超时,这题需要很多剪枝 ...

  3. booststrap select2的应用总结

    本身对前端js了解不是特别多,在项目中,遇到很多前端的问题,有时间整理一下,有不对的地方,不吝赐教,多多批评指正. 在项目中,遇到最多的select下拉框情景,莫过于多选和单选了 单选是很容易理解的, ...

  4. MongoDB(课时3 MongoDB基本操作)

    3.3 MongoDB的基本操作 在MongoDB数据库里面存在数据库的概念,但没有模式(所有的信息都是按照文档保存的),保存数据的结构是BSON结构,只不过在进行一些数据处理的时候才会使用到Mong ...

  5. 引用类(RC)

    R 中还有一种具有引用语义的类系统,它更像其他面向对象编程语言中的类系统.首先,为了定义一个引用类( reference class , RC ),我们要给 setRefClass( )一个类定义.不 ...

  6. [原][osg][gdal]两种方式修改tiff高程

    因为对于globalmap不熟悉,不怎么怎么修改高程,好像也没有这功能. 干脆自己手动修改了高程图tiff了 由于自身一直使用osg的 自己使用了osgDB直接读取tiff,修改后保存的. 同事小周一 ...

  7. dom 绑定数据

    一.绑定/修改    .jQuery修改属性值,都是在内存中进行的,并不会修改 DOM 1.  对象绑定  $(selector).data(name) $("#form").da ...

  8. Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装

    Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装 你们可以直接去,http://blog.csdn.net/wei_chong_chong/ar ...

  9. C++编程模板2

    C++编程模板2 #include <iostream> using namespace std; /* */ int main(){ int ans; printf("%d\n ...

  10. Confluence 6 导入 Active Directory 服务器证书 - Windows

    为了让你的应用服务器能够信任你的目录服务器.你目录服务器上导出的证书需要导入到你应用服务器的 Java 运行环境中.JDK 存储了信任的证书,这个存储信任证书的文件称为一个 keystore.默认的 ...