JSON值可以包含多行字符串吗


114

我正在编写一个Java文件可以读取的JSON文件。片段如下...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}


17
我认为这更多是关于序列化JSON文件的可读性,而不是有关加载的数据中的换行符(因此,不是JSON中多行字符串的重复)。可以将其更像是将JSON用作配置文件,在该文件中您有一个很长的字符串,并且出于可读性考虑,如果有人通过文本编辑器对其进行了编辑,则对字符串进行硬包装很有帮助。
zashu

2
@zashu:大多数文本编辑器都具有软包装功能。这比某些硬编码的行宽立即有用。
Lightness Races in Orbit

4
@LightnessRacesinOrbit在这么长的文件上运行git diff(或解决合并冲突)也很麻烦。
休伯特·卡里奥

1
这是JSON中的多行字符串的重复,引用了OP的问题:“ JSON中可能有多行字符串吗?这主要是为了视觉舒适,所以我想我可以在编辑器中打开自动换行功能,但是我“只是有点好奇...
安德烈·菲格雷多

Answers:


61

查看规格!JSON语法的char生成可以采用以下值:

  • 任何Unicode字符,除了"- \或- 或控制字符
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 四十六进制数字

换行符是“控制字符”,因此,不,您的字符串中可能没有文字换行符。但是,您可以使用\n\r所需的任意组合对其进行编码。

JSONLint工具确认您的JSON是无效的。


更新:而且,如果您想在JSON语法中编写换行符而又没有在数据中实际包含换行符,那么您甚至会加倍走运。尽管JSON在某种程度上是对人类友好的,但它仍然是数据,您正在尝试将任意格式应用于该数据。绝对不是JSON的意思。


32

我不确定您的确切要求,但是提高“可读性”的一种可能解决方案是将其存储为数组。

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

如有需要,可以再次加入

result.join(" ")

13
但这不是语义。这是一个抽象泄漏。我认为以这种方式指定的数据格式本质上是损坏的。
Lightness Races in Orbit

4
我无法想象以这种方式设计API或JSON文档只是为了增加字符串的可读性(我猜只是出于调试的原因):| ....
Adam Dyga

“我认为以这种方式指定的数据格式实质上是损坏的。” 但是,请考虑将其用于测试用例。如果要对字符串进行硬编码,则可能需要一个属性文件。我个人通常情况下不会在JSON中存储“真实”数据。但是,如果这是从不进行测试到进行测试的简单方法,那么就去吧。
sf_jeff '16

@AdamDyga实际上对于将json文件存储到CVS中很有用,其中delta的单位是行。
yota

7

不是很好的解决方案,但是您可以尝试使用hjson工具。链接。它允许您在编辑器中编写多行文本,然后将其转换为正确的有效JSON格式。注意:它为新行添加了'\ n'字符,但是您可以使用“全部替换..”功能在任何文本编辑器中将其删除。

PS应该是对该问题的评论,但没有足够的仓库,对不起。


实际上,这是个好主意。版本控制Hjson,并根据需要将其转换为JSON。
Lightness Races in Orbit

3

据我了解,问题不是关于如何使用带有控制符号的字符串,json而是如何在文件中存储和恢复json,您可以在其中使用编辑器控制符号分割字符串。

如果要在文件中存储多行字符串,则文件将不存储有效json对象。但是,如果json仅在程序中使用文件,那么每次将数据加载到程序中然后传递给json解析器时,都可以根据需要存储数据并从文件中手动删除所有换行符。

或者,这可能更好,您可以将json数据源文件放在您要编辑的字符串中,然后使用某个实用程序将所有新行删除到json程序将使用的有效文件中。


2

我相信这取决于您使用的是什么json解释器...在普通javascript中,您可以使用行终止符

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}

这是正确的,但是缩进空格将输出:a\ c=> a c
安德烈·菲格雷多

1
JavaScript没有可以接受此内容的“ JSON解释器”。它只能在字符串中使用JSON。的确,如果您在字符串文字中提供JSON,则可以采用这种方法,但这是不寻常的事情。您是否将JSON与JavaScript中的实际对象声明混淆了?
Lightness Races in Orbit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.