下面的JSON串:

  1. {
  2. "a":"x=\"a,b\""
  3. }

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

  1. procedure JsonFormatTest;
  2. var jo:TJsonObject;
  3. j:TJson;
  4. begin
  5. jo := TJsonObject.Create;
  6. jo.AddPair('a', 'x="a,b"');
  7.  
  8. j := TJson.Create;
  9. ShowMessage( j.Format(jo) );
  10. end;

变成这样:

  1. {
  2. "a":"x=\"a,
  3. b\""
  4. }

下面是修正方法:

  1. unit MM.Helpers.REST.Json;
  2.  
  3. interface
  4.  
  5. uses
  6. System.Types, System.JSON, REST.Json;
  7.  
  8. type
  9. TJsonHelper = class helper for TJson
  10. public
  11. class function HFormat(AJsonValue: TJsonValue): string;
  12. end;
  13.  
  14. implementation
  15.  
  16. { TJsonHelper }
  17.  
  18. class function TJsonHelper.HFormat(AJsonValue: TJsonValue): string;
  19. var
  20. s: string;
  21. c: char;
  22. EOL: string;
  23. INDENT: string;
  24. LIndent: string;
  25. isEOL: boolean;
  26. isInString: boolean;
  27. isEscape: boolean;
  28. begin
  29. Result := '';
  30. EOL := sLineBreak; // kanteruk: use platform line brake
  31. INDENT := ' ';
  32. isEOL := true;
  33. isInString := false;
  34. isEscape := false;
  35. s := AJsonValue.ToJSON; // kanteruk: fix here
  36. for c in s do
  37. begin
  38. if not isInString and ((c = '{') or (c = '[')) then
  39. begin
  40. if not isEOL then
  41. Result := Result + EOL;
  42. Result := Result + LIndent + c + EOL;
  43. LIndent := LIndent + INDENT;
  44. Result := Result + LIndent;
  45. isEOL := true;
  46. end
  47. else if not isInString and (c = ',') then
  48. begin
  49. isEOL := false;
  50. Result := Result + c + EOL + LIndent;
  51. end
  52. else if not isInString and ((c = '}') or (c = ']')) then
  53. begin
  54. Delete(LIndent, , Length(INDENT));
  55. if not isEOL then
  56. Result := Result + EOL;
  57. Result := Result + LIndent + c + EOL;
  58. isEOL := true;
  59. end
  60. else
  61. begin
  62. isEOL := false;
  63. Result := Result + c;
  64. end;
  65. if not isEscape and (c = '"') then
  66. isInString := not isInString;
  67. isEscape := (c = '\') and not isEscape; // kanteruk: fix here, move this line down
  68. end;
  69. end;
  70.  
  71. 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. The way to Go(5): 文件名、关键字与标识符

    Reference: Github: Go Github: The way to Go 文件名 1.后缀名:.go 2.小写字母 3._分割名称 4.不包含空格或其他特殊字符 标识符 有效的标识符必须 ...

  3. Croc Champ 2013 - Round 1 E. Copying Data 分块

    E. Copying Data time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. Cocos2d-x学习笔记(一)环境搭建与项目创建

    可运行的代码可以说明一切问题. 环境需安装VS201x + Python2.7 + Cocos2d-x-2.2.5.(Linux下参考链接:http://www.cocos2d-x.org/wiki/ ...

  5. 解决在nginx+php环境下$_SERVER['PHP_SELF']获取不到值的问题

    Tp3.2. __APP__获取值不正确.$_SERVER['PHP_SELF']为空导致. 原来是php.ini的问题. sudo vim /usr/local/php/etc/php.ini 重启 ...

  6. Thunder团队Alpha周贡献分规则及贡献分分配结果

    小组名称:Thunder 项目名称:爱阅app 组长:王航 成员:李传康.代秋彤.邹双黛.苗威.宋雨.胡佑蓉.杨梓瑞 Alpha周贡献分分配结果

  7. centos 6.5 安装mplayer

    https://centos.pkgs.org/6/linuxtech/mplayer-1.0.4-3.el6.x86_64.rpm.html

  8. 解决dos窗口乱码问题

    大家有没有遇到这样的情况,看着就糟心 打开dos窗口, 输入命令 chcp 936 (936表示中文编码GBK, 也可以设置其他编码), 回车一下执行.  鼠标右键 -> 属性  (关键一步): ...

  9. grub 启动错误 "file not found"

    刚安装ubuntu 14.4 竟然出现这么尴尬的事,ubuntu 行不行? 幸好还是能从u盘启动后,转到硬盘. 然后在网上找到了解决方法. http://askubuntu.com/questions ...

  10. 一个登陆浏览api接口; 其他相关: Form_with参数的不同写法; 简单使用curl。

    eeting-up app: 完成一个需求: 完成:https://github.com/chentianwei411/meeting-up-app 第四步实现API接口 Add api base a ...