JSON中是否可以有多行字符串?
这主要是为了视觉舒适,所以我想我可以在我的编辑器中打开自动换行,但我只是有点好奇。
我正在以 JSON 格式编写一些数据文件,并且希望将一些非常长的字符串值拆分为多行。使用 python 的 JSON 模块,无论我使用 \
还是 \n
作为转义,我都会遇到很多错误。
JSON 不允许真正的换行符。您需要用 \n
替换所有换行符。
例如:
"first line second line"
可以保存:
"first line\nsecond line"
笔记:
对于 Python
,应写为:
"first line\\nsecond line"
其中 \\
用于转义反斜杠,否则 python 会将 \n
视为控制字符“换行符”
不幸的是,这里的许多答案都解决了如何在字符串数据中放置换行符的问题。问题是如何通过将字符串值拆分为多行代码来使代码看起来更好。 (即使是承认这一点的答案也提供了“解决方案”,假设一个人可以自由地更改数据表示,而在许多情况下却不是。)
更糟糕的消息是,没有好的答案。
在许多编程语言中,即使它们不明确支持跨行拆分字符串,您仍然可以使用字符串连接来获得所需的效果;只要编译器不糟糕,这很好。
但是 json 不是一种编程语言;它只是一个数据表示。你不能告诉它连接字符串。它的(相当小的)语法也不包括任何在多行上表示字符串的工具。
由于没有设计某种预处理器(而且我不想有效地编写自己的语言来解决这个问题),所以没有一个通用的解决方案来解决这个问题。如果您可以更改数据格式,则可以替换字符串数组。否则,这是 json 并非为人类可读性而设计的众多方式之一。
我不得不为一个小型 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>"
],
}
解析后,我只使用 myData.modify_head.join('\n')
或 myData.modify_head.join()
,这取决于我是否想要在每个字符串后换行。
这对我来说看起来很整洁,除了我必须在任何地方使用双引号。否则,我也许可以使用 YAML,但它还有其他缺陷,并且本机不支持。
查看the specification! JSON 语法的 char 产生式可以采用以下值:
任何 Unicode 字符,除了-"-or-\-or-control-character
\"
\\
\/
\b
\F
\n
\r
\t
\u 四位十六进制数字
换行符是“控制字符”,因此,不,您的字符串中可能没有文字换行符。但是,您可以使用所需的任何 \n
和 \r
组合对其进行编码。
JSON 不允许换行以提高可读性。
你最好的选择是使用一个可以为你换行的 IDE。
这是一个非常古老的问题,但我在搜索中遇到了这个问题,我想我知道你的问题的根源。
JSON 不允许在其数据中使用“真正的”换行符;它只能逃脱换行符。请参阅 @YOU 中的 answer。根据问题,您似乎试图以两种方式在 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 库具有支持多行字符串的选项。我这样说是要警告的,这会损害您的互操作性。
然而,在我遇到的特定场景中,我需要制作一个仅由一个系统使用过的配置文件,该文件可供人类阅读和管理。并最终选择了这个解决方案。
以下是使用 Jackson 在 Java 上的效果:
JsonMapper mapper = JsonMapper.builder()
.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
.build()
您可以在客户端编码并在服务器端解码。这也将处理 \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>
如果只是为了在您的编辑器中进行演示,您可以使用 ` 而不是 " 或 '
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`);
将放入控制台:第一行第二行
希望这回答了你的问题。
试试这个,它还可以处理 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');
}
\n
将数据存储在 JSON 中并通过 Curses 输出),\n
似乎可以正常工作。这似乎取决于视图/渲染引擎。