JSON格式中是否可以有多行字符串?
我想主要是为了视觉上的舒适性,所以我可以在编辑器中打开自动换行功能,但我只是有些好奇。
我正在使用JSON格式编写一些数据文件,并希望将一些非常长的字符串值拆分为多行。使用Python的JSON模块时,无论我使用\
还是\n
作为转义字符,都会出现很多错误。
JSON格式中是否可以有多行字符串?
我想主要是为了视觉上的舒适性,所以我可以在编辑器中打开自动换行功能,但我只是有些好奇。
我正在使用JSON格式编写一些数据文件,并希望将一些非常长的字符串值拆分为多行。使用Python的JSON模块时,无论我使用\
还是\n
作为转义字符,都会出现很多错误。
JSON 不允许真正的换行。你需要用 \n
替换所有换行。
例如:
"first line
second line"
可使用以下方式保存:
"第一行\n第二行"
注意:
对于Python
,应写成:
"第一行\\n第二行"
其中\\
是用于转义反斜杠的,否则python将把\n
视为控制字符"新行"
\n
并通过Curses输出),\n
似乎可以正常工作。这似乎取决于视图/渲染引擎是否支持。 - ashes999我曾经在一个小的Node.js项目中不得不这样做,找到了这个解决方法,将多行字符串存储为行数组,使其更易读(需要额外的代码将它们转换为字符串):
{
"modify_head": [
"<script type='text/javascript'></script>"
],
"modify_body": [
"<input type='text' id='inputtext'></input>",
"<button onclick=drawSomeText('ExampleCanvas')></button>"
],
}
一旦解析,我只需要使用myData.modify_head.join('\n')
或myData.modify_head.join()
,具体取决于是否需要在每个字符串后面换行。
这看起来很整洁,但我必须在所有地方使用双引号。不过除此之外,我可以尝试使用YAML,但它有其他缺陷且不得到本地支持。
"
、\
或控制字符之外的字符\"
\\
\/
\b
\f
\n
\r
\t
\u
四个十六进制数字\n
和\r
的组合进行编码。JSON 不支持为了可读性而换行。
最好的方法是使用一个能自动换行的集成开发环境(IDE)。
这是一个非常老的问题,但我在搜索时遇到了它,我想我知道你问题的源头。
JSON不允许在其数据中使用“真正的”换行符;它只能有转义后的换行符。参见@YOU的answer。根据问题,看起来你尝试用两种方式在Python中转义换行符:使用行续字符("\"
)或使用"\n"
作为转义符。
但要记住:如果你在Python中使用字符串,特殊的转义字符("\t"
,"\n"
)将被翻译成实际的控制字符!"\n"
将被替换为表示换行符的ASCII控制字符,这恰好是JSON中不合法的字符。(至于行续字符,则只是去掉了换行符。)
r
,例如r"abc\ndef"
),或在换行符前面包含一个额外的斜杠("abc\\ndef"
)来实现这一点。"\n"
替换为真正的换行ASCII控制字符,而是将"\n"
保留为两个字面字符,然后JSON可以解释为换行转义。{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
我们可以轻松地迭代数组,以多行方式显示内容。
$ 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有关,我找到了两个解决方案:
hjson source.json > target.hjson
将现有的json文件转换为hjson格式,使用您喜欢的编辑器进行编辑,然后再将其转换回json hjson -j target.hjson > source.json
。您可以在here下载二进制文件或使用在线转换here。