是否有可能在JSON中有多行字符串?

这主要是为了视觉上的舒适,所以我想我可以在编辑器中打开自动换行,但我只是有点好奇。

我正在编写JSON格式的一些数据文件,并希望有一些非常长的字符串值分割在多行。使用python的JSON模块,无论我使用\或\n作为转义,我都会得到很多错误。


当前回答

这是一个非常老的问题,但当我想提高使用复杂条件表达式的Vega JSON规范代码的可读性时,我也有同样的问题。代码是这样的。

正如这个答案所说,JSON不是为人类设计的。我知道这是一个历史性的决定,它对数据交换的目的是有意义的。然而,JSON仍然被用作这种情况下的源代码。所以我要求我们的工程师使用Hjson作为源代码,并将其处理成JSON。

例如,在Git For Windows环境中, 你可以下载Hjson命令行的二进制文件,放在git/bin目录下使用。 然后,转换(转译)Hjson源为JSON。使用自动化工具(如Make)将有助于生成JSON。

$ which hjson
/c/Program Files/git/bin/hjson

$ cat example.hjson
{
  md:
    '''
    First line.
    Second line.
      This line is indented by two spaces.
    '''
}

$ hjson -j example.hjson > example.json

$ cat example.json
{
  "md": "First line.\nSecond line.\n  This line is indented by two spaces."
}

如果要在编程语言中使用转换后的JSON,特定于语言的库(如hjson-js)将非常有用。

我注意到在一个重复的问题中张贴了同样的想法,但我想分享更多的信息。

其他回答

虽然不是标准的,但我发现一些JSON库有支持多行字符串的选项。我是带着警告说的,这将损害您的互操作性。

然而,在我遇到的特定场景中,我需要使一个只被一个系统使用的配置文件可被人类阅读和管理。最终选择了这个解决方案。

下面是如何在Java上使用Jackson实现的:

JsonMapper mapper = JsonMapper.builder()
   .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
   .build()

这是一个非常老的问题,但我在搜索中发现了这个问题,我想我知道你问题的根源了。

JSON不允许在其数据中出现“真正的”换行符;它只能有换行符。请看来自@YOU的回答。根据问题,看起来您试图在Python中转义换行有两种方式:使用行延续字符(“\”)或使用“\n”作为转义符。

但请记住:如果你在python中使用字符串,特殊转义字符(“\t”,“\n”)将被转换为REAL控制字符!“\n”将被替换为表示换行符的ASCII控制字符,而换行符正是JSON中不合法的字符。(至于换行字符,它只是把换行符去掉。)

所以你需要做的是防止Python转义字符。你可以通过使用一个原始字符串(将r放在字符串前面,如r"abc\ndef",或者在换行符前包含一个额外的斜杠("abc\\ndef")来做到这一点。

上述两种方法都不会将“\n”替换为真正的换行ASCII控制字符,而是将“\n”保留为两个文字字符,然后JSON可以将其解释为换行转义。

\n\r\n为我工作!!

\n表示单行换行,\n\r\n表示双行换行

您可以在客户端编码,在服务器端解码。这也可以处理\n和\t字符

例:我需要通过json发送多行xml

{
  "xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CiAgPFN0cnVjdHVyZXM+CiAgICAgICA8aW5wdXRzPgogICAgICAgICAgICAgICAjIFRoaXMgcHJvZ3JhbSBhZGRzIHR3byBudW1iZXJzCgogICAgICAgICAgICAgICBudW0xID0gMS41CiAgICAgICAgICAgICAgIG51bTIgPSA2LjMKCiAgICAgICAgICAgICAgICMgQWRkIHR3byBudW1iZXJzCiAgICAgICAgICAgICAgIHN1bSA9IG51bTEgKyBudW0yCgogICAgICAgICAgICAgICAjIERpc3BsYXkgdGhlIHN1bQogICAgICAgICAgICAgICBwcmludCgnVGhlIHN1bSBvZiB7MH0gYW5kIHsxfSBpcyB7Mn0nLmZvcm1hdChudW0xLCBudW0yLCBzdW0pKQogICAgICAgPC9pbnB1dHM+CiAgPC9TdHJ1Y3R1cmVzPg=="
}

然后在服务器端解码

public class XMLInput
{
        public string xml { get; set; }
        public string DecodeBase64()
        {
            var valueBytes = System.Convert.FromBase64String(this.xml);
            return Encoding.UTF8.GetString(valueBytes);
        }
}

public async Task<string> PublishXMLAsync([FromBody] XMLInput xmlInput)
{
     string data = xmlInput.DecodeBase64();
}

一旦解码,您将得到原始的XML

<?xml version="1.0" encoding="utf-8" ?>
  <Structures>
       <inputs>
               # This program adds two numbers

               num1 = 1.5
               num2 = 6.3

               # Add two numbers
               sum = num1 + num2

               # Display the sum
               print('The sum of {0} and {1} is {2}'.format(num1, num2, sum))
       </inputs>
  </Structures>

JSON不允许为了可读性而换行。

最好的办法是使用一个可以为您换行的IDE。