JSON中是否可以有多行字符串?
这主要是为了视觉舒适,所以我想我可以在我的编辑器中打开自动换行,但我只是有点好奇。
我正在以 JSON 格式编写一些数据文件,并且希望将一些非常长的字符串值拆分为多行。\
使用 python 的 JSON 模块,无论是使用还是\n
作为转义,我都会遇到很多错误。
JSON不允许真正的换行符。您需要将所有换行符替换为\n
.
例如:
"first line
second line"
可以保存:
"first line\nsecond line"
笔记:
对于Python
,这应该写成:
"first line\\nsecond line"
where\\
用于转义反斜杠,否则 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')
or myData.modify_head.join()
,这取决于我是否想要在每个字符串之后换行。
这对我来说看起来很整洁,除了我必须在任何地方使用双引号。否则,我也许可以使用 YAML,但它还有其他缺陷,并且本机不支持。
看看规格!JSON 语法的char产生可以采用以下值:
"
-\
或 - 或控制字符\"
\\
\/
\b
\f
\n
\r
\t
\u
四位十六进制数换行符是“控制字符”,因此,不,您的字符串中可能没有文字换行符。但是,您可以使用您需要的任何组合对其\n
进行编码。\r
JSON 不允许换行以提高可读性。
你最好的选择是使用一个可以为你换行的 IDE。
这是一个非常古老的问题,但我在搜索中遇到了这个问题,我想我知道你的问题的根源。
JSON 不允许在其数据中使用“真正的”换行符;它只能逃脱换行符。请参阅@YOU的答案。根据问题,您似乎试图以两种方式在 Python 中转义换行符:使用续行符 ( ) 或用作转义符。"\"
"\n"
但请记住:如果您在 python 中使用字符串,特殊的转义字符 ( "\t"
, "\n"
) 将被转换为 REAL 控制字符!将"\n"
被替换为代表换行符的 ASCII 控制字符,这正是 JSON 中非法的字符。(至于换行符,它只是将换行符取出。)
所以你需要做的是防止Python转义字符。您可以通过使用原始字符串(放在字符串r
前面,如 in 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"]
}
我们可以轻松地迭代数组以多行方式显示内容。
您可以在客户端编码并在服务器端解码。这也将处理 \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 库具有支持多行字符串的选项。我这样说是要警告的,这会损害您的互操作性。
然而,在我遇到的特定场景中,我需要制作一个仅由一个系统使用过的配置文件,该文件可供人类阅读和管理。并最终选择了这个解决方案。
以下是使用Jackson在 Java 上的效果:
JsonMapper mapper = JsonMapper.builder()
.enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
.build()
使用字符串数组:
{
"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("\n")
试试这个,它还可以处理 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');
}