下面的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. vs2010中自动给函数或者类加上注释宏模板

    Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...

  2. hdoj-2086-A1=?

    题目:A1=? 代码(作者:Fistice): #include<cstdio> #include<cmath> #include<cstring> #includ ...

  3. quality center 支持的平台

  4. jenkins 插件,下载地址

    http://updates.jenkins-ci.org/download/plugins/ 通常我们需要下载的插件有如下几个:

  5. Java并发编程:Callable、Future和FutureTask(转)

    Java并发编程:Callable.Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一 ...

  6. 递归C++

    递归C++ 一.递归简介 自己调用自己 二.递归写法 2.1 写法介绍 先写出问题的递推公式 递归部分的边界条件就是递推公式中的边界条件 递归部分的主体部分就是递推公式中的主体部分 2.2 实例 (1 ...

  7. 页面title改变浏览器兼容性问题

    前一阵子客户在界面上改了下小小的需求,需要点不同的文章title显示不同的模块名称(之前没有区分,统一叫新闻图片),很简单的一个需求但是测试的时候并没有注意到不兼容IE7和IE8.在客户那被尴尬的发现 ...

  8. robot framework学习笔记2

    声明:本笔记都只是自己根据大牛虫师的robot系列文档学习记录的,学习的话还请移步虫师博客:https://www.cnblogs.com/fnng/ 非常感谢大牛的分享,带小白一步一步入门   F5 ...

  9. 启动Eclipse时发生An internal error occurred during: "Initializing Java Tooling"错误

    详细提示如下: An internal error occurred during: "Initializing Java Tooling". Illegal exception ...

  10. laravel实现定时器功能

    前记 laravel实现定时器功能有两种方法: 1. 使用 command . 2.   在闭包函数内写实现的方法. 在这里我比较推荐第一种方法,因为第一种方法把具体的实现抽离出来了,看起来简单且富有 ...