[英]Are multi-line strings allowed in JSON?
JSON中是否可以有多行字符串?
这主要是为了视觉上的舒适,所以我想我可以在我的编辑器中打开自动换行,但我只是有点好奇。
我正在以 JSON 格式编写一些数据文件,并希望将一些非常长的字符串值分成多行。 使用 python 的 JSON 模块,无论我使用\
还是\n
作为转义符,我都会遇到很多错误。
JSON不允许真正的换行符。 您需要用\\n
替换所有换行符。
例如:
"first line second line"
可以保存:
"first line\\nsecond line"
笔记:
对于Python
,这应该写成:
"first line\\\\nsecond line"
其中\\\\
用于转义反斜杠,否则 python 会将\\n
视为控制字符“换行”
我不得不为一个小型 Node.js 项目执行此操作,并找到了以下解决方法:
{
"modify_head": [
"<script type='text/javascript'>",
"<!--",
" function drawSomeText(id) {",
" var pjs = Processing.getInstanceById(id);",
" var text = document.getElementById('inputtext').value;",
" pjs.drawText(text);}",
"-->",
"</script>"
],
"modify_body": [
"<input type='text' id='inputtext'></input>",
"<button onclick=drawSomeText('ExampleCanvas')></button>"
],
}
这对我来说看起来很整洁,除此之外我必须在任何地方使用双引号。 否则,我也许可以使用 YAML,但它还有其他缺陷,并且不受本机支持。 解析后,我只使用myData.modify_head.join('\\n')
或myData.modify_head.join()
,具体取决于我是否想要在每个字符串后换行。
不幸的是,这里的许多答案解决了如何在字符串数据中放置换行符的问题。 问题是如何通过将字符串值拆分为多行代码来使代码看起来更好。 (甚至承认这一点的答案也提供了“解决方案”,假设人们可以自由地更改数据表示,而在许多情况下却不是这样。)
更糟糕的消息是,没有好的答案。
在很多编程语言中,即使它们不明确支持跨行拆分字符串,您仍然可以使用字符串连接来获得所需的效果; 只要编译器不是很糟糕,就可以了。
但是 json 不是一种编程语言; 它只是一个数据表示。 你不能告诉它连接字符串。 它的(相当小的)语法也不包括用于在多行上表示字符串的任何工具。
没有设计某种预处理器(对于一个人来说,我不想有效地编写自己的语言来解决这个问题),这个问题没有通用的解决方案。 如果您可以更改数据格式,那么您可以替换一个字符串数组。 否则,这是 json 不是为人类可读性而设计的众多方式之一。
查看规格! JSON 语法的char生成可以采用以下值:
"
-or- \\
-or-control-character\\"
\\\\
\\/
\\b
\\f
\\n
\\r
\\t
\\u\u003c/code>四位十六进制数字
换行符是“控制字符”,因此,不,您的字符串中可能没有文字换行符。 但是,您可以使用所需的
\\n
和\\r
任何组合对其进行编码。
JSON 不允许为了可读性而换行。
你最好的选择是使用一个可以为你换行的 IDE。
这是一个非常古老的问题,但我在搜索中遇到了这个问题,我想我知道您的问题的根源。
JSON 不允许在其数据中使用“真正的”换行符; 它只能转义换行符。 请参阅@YOU的答案。 根据问题,您似乎试图通过两种方式在 Python 中转义换行符:使用行继续符 ( "\\"
) 或使用"\\n"
作为转义符。
但请记住:如果您在 python 中使用字符串,特殊的转义字符( "\\t"
、 "\\n"
)会被转换为真正的控制字符! "\\n"
将被替换为代表换行符的 ASCII 控制字符,这正是 JSON 中的非法字符。 (至于换行符,它只是简单地取出换行符。)
所以你需要做的是防止Python对字符进行转义。 您可以通过使用原始字符串(将r
放在字符串前面,如r"abc\\ndef"
,或通过在换行符 ( "abc\\\\ndef"
) 前面包含一个额外的斜杠来执行此操作。
上述两种意志,而不是取代的"\\n"
与真实换行符ASCII控制字符,会留下"\\n"
两个文字字符,然后JSON可以解释为一个换行符逃逸。
将属性值写为字符串数组。 就像这里给出的例子https://gun.io/blog/multi-line-strings-in-json/ 。 这会有所帮助。
我们总是可以将字符串数组用于多行字符串,如下所示。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
我们可以轻松地迭代数组以多行方式显示内容。
是否可以在JSON中使用多行字符串?
是。 我刚刚使用我的Firefox网络浏览器测试了这一点,按F12,点击控制台并在屏幕底部输入。
x={text:"hello\nworld"}
对象x刚刚从包含多行字符串的JSON格式字符串创建。
console.log(x.text)
hello
world
显示x.text,显示它是一个多行字符串。
这两个测试表明,Firefox的Javascript解释器很乐意使用多行字符串创建和使用JSON。
使用JSON.stringify
和JSON.parse
进行的更多测试表明,Javascript解释器可以将包含多行字符串的对象转换为JSON并再次解析它,完全没有任何问题。
我过去将莎士比亚的全部作品存储为JSON对象中的属性,然后通过互联网发送,没有损坏。
这是通过三行输入的两行字符串
x={text:"expert\
s\nex\
change"}
我们可以显示对象
console.log(x)
给
Object { text: "experts\nexchange" }
或者字符串
console.log(x.text)
给
experts
exchange
字符串中的行结束来自使用\\ n,并且在行的末尾仅使用\\来实现多个输入行。
实际上,您可能希望将行结尾与字符串中的行结尾同步,例如
x={text:"experts\n\
exchange"}
console.log("Hello\nWorld".length)
11
console.log("Hello World".length)
11
请注意,带换行符的字符串不长于带空格的字符串。 即使键盘上键入了两个字符('\\'和'n'),字符串中也只存储一个字符。
使用正则表达式将所有出现的\\r\\n
替换为\\\\n
。
这在scala中对我有用。
val newstr = str.replace("\r\n", "\\n")
使用json5(loader)参见https://json5.org/ - example(by json5)
{
lineBreaks: "Look, Mom! \
No \\n's!",
}
如果您愿意使用Node.js,您可以这样做:
module.exports = {
multilineStr: `
dis my life
it's now or never
`
}
您可以使用Node.js导入并轻松将其转换为JSON:
echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`
你得到:
{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}
它是如何工作的 :你使用Node.js加载一个JS模块,它创建一个JS对象,可以很容易地被Node.js字符串化。 -e选项评估字符串, -p
选项将最后一个Node.js操作的返回结果回显到stdout。
如果要加载位于不同工作目录中的.js脚本,则必须切换“”和“”字符串:
my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
虽然不是标准的,但我发现一些 JSON 库有支持多行字符串的选项。 我在说这句话时要注意,这会损害您的互操作性。
然而,在我遇到的特定场景中,我需要制作一个只能由一个系统使用的配置文件,该文件可供人类阅读和管理。 并最终选择了这个解决方案。
以下是使用Jackson在 Java 上的工作方式:
JsonMapper mapper = JsonMapper.builder()
.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
.build()
试试这个,它还可以处理 JSON.parse() 方法解析失败的单引号,并且还支持 UTF-8 字符代码。
parseJSON = function() {
var data = {};
var reader = new FileReader();
reader.onload = function() {
try {
data = JSON.parse(reader.result.replace(/'/g, "\""));
} catch (ex) {
console.log('error' + ex);
}
};
reader.readAsText(fileSelector_test[0].files[0], 'utf-8');
}
使用字符串数组:
{
"text": [
"line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 ",
"line 2 line 2 line 2 line 2 line 2 line 2 line 2 line 2"
]
}
然后在代码中加入它们:
<your JSON object>.text.join()
您可以对 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>
\n\r\n
为我工作!
\n
表示单行换行, \n\r\n
表示双行换行
我在这里看到许多答案在大多数情况下可能不起作用,但如果假设你想要 output 你在 JSON 文件中写下的内容,这可能是最简单的解决方案(例如:对于语言翻译,你只想拥有一个键超过 1客户端上输出的行)可以只添加一些您选择的特殊字符PS:JSON 文件允许在新行之前像\\
并使用一些 JS 来解析文本...例如:
{"text": "some JSON text. \\ Next line of JSON text"}
import text from 'text.json'
{text.split('\\')
.map(line => {
return (
<div>
{line}
<br />
</div>
);
})}}
这是一个非常古老的问题,但当我想提高使用复杂条件表达式的 Vega JSON 规范代码的可读性时,我遇到了同样的问题。 代码是这样的。
正如这个答案所说, JSON 不是为人类设计的。 我知道这是一个历史性的决定,对于数据交换目的来说是有意义的。 但是,JSON 仍然用作此类案例的源代码。 于是就让我们的工程师对源码使用Hjson ,处理成JSON。
比如Git为Windows环境,可以下载Hjson cli binary,放到git/bin目录下使用。 然后,将Hjson源转换(transpile)为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 有关,我找到了两个解决方案:
hjson source.json > target.hjson
将现有的 json 文件转换为 hjson 格式,在您喜欢的编辑器中进行编辑,然后转换回 json hjson -j target.hjson > source.json
。 您可以在此处下载二进制文件或在此处使用在线转换。 尝试使用base64
编码的字符串值。 大部分时间都在为我工作。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
在base64
编码后的字符串看起来像
{
"singleLine": "Some singleline String",
"multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
}
base64编码和解码以所有语言提供。
如果它只是为了在您的编辑器中展示,您可以使用 ` 而不是 " 或 '
const obj = {
myMultiLineString: `This is written in a \
multiline way. \
The backside of it is that you \
can't use indentation on every new \
line because is would be included in \
your string. \
The backslash after each line escapes the carriage return.
`
}
例子:
console.log(`First line \
Second line`);
将放入控制台:
第一行 第二行
console.log(`First line
second line`);
将放入控制台:
第一行
第二行
希望这回答了你的问题。
将多行文本放在txt文件上然后
var str = {
text: cat('path_to_file/text.txt')
}
(它在mongoDB上运行)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.