ChatGPT解决这个技术问题 Extra ChatGPT

JSON 中是否允许使用多行字符串?

JSON中是否可以有多行字符串?

这主要是为了视觉舒适,所以我想我可以在我的编辑器中打开自动换行,但我只是有点好奇。

我正在以 JSON 格式编写一些数据文件,并且希望将一些非常长的字符串值拆分为多行。使用 python 的 JSON 模块,无论我使用 \ 还是 \n 作为转义,我都会遇到很多错误。

结构化数据:将多行字符串分解为字符串数组,然后将它们连接起来。
试试 hjson 工具。它会将您在 json 中的多行字符串转换为正确的 json 格式。

N
Neuron

JSON 不允许真正的换行符。您需要用 \n 替换所有换行符。

例如:

"first line second line"

可以保存:

"first line\nsecond line"

笔记:

对于 Python,应写为:

"first line\\nsecond line"

其中 \\ 用于转义反斜杠,否则 python 会将 \n 视为控制字符“换行符”


-1 OP 正在使用“\n”转义序列。它不起作用,因为它们没有将反斜杠转义为“\\n”,因此 Python 将转义序列转换为换行符,而不是按照 JSON 的要求将其保留为字面上的反斜杠后跟 en。
@user359996 我不确定这是真的。对我来说(仅使用 \n 将数据存储在 JSON 中并通过 Curses 输出),\n 似乎可以正常工作。这似乎取决于视图/渲染引擎。
@Nawaz:“\n”和“\r”分别是换行和回车的转义序列。它们不是文字换行和回车控制字符。作为一个更清楚的附加示例,请考虑“\\”是反斜杠的转义序列,而不是文字反斜杠。 JSON 语法明确排除了控制字符(参见“char”定义),而是通过转义序列(\\、\r、\n 等)提供它们的表示。
OP 不想 represent 新行,而是在多个源代码行上格式化一个逻辑 JSON 行。他确实通过谈论 \n 来搅浑水。他想要我们在过去称为“延续线”pages.mtu.edu/~shene/COURSES/cs201/NOTES/chap01/continue.html 的东西。
不回答问题。
M
Mark Adelsberger

不幸的是,这里的许多答案都解决了如何在字符串数据中放置换行符的问题。问题是如何通过将字符串值拆分为多行代码来使代码看起来更好。 (即使是承认这一点的答案也提供了“解决方案”,假设一个人可以自由地更改数据表示,而在许多情况下却不是。)

更糟糕的消息是,没有好的答案。

在许多编程语言中,即使它们不明确支持跨行拆分字符串,您仍然可以使用字符串连接来获得所需的效果;只要编译器不糟糕,这很好。

但是 json 不是一种编程语言;它只是一个数据表示。你不能告诉它连接字符串。它的(相当小的)语法也不包括任何在多行上表示字符串的工具。

由于没有设计某种预处理器(而且我不想有效地编写自己的语言来解决这个问题),所以没有一个通用的解决方案来解决这个问题。如果您可以更改数据格式,则可以替换字符串数组。否则,这是 json 并非为人类可读性而设计的众多方式之一。


目前尚不清楚OP想要什么,字符串中的换行符或更好地组织字符串......
@9ilsdx9rvj0lo:不,不是。
这是 OP 真正想要的正确答案,SO DO ME,即使结果听起来对 JSON 格式化程序不太满意......
杰出的。这是我一直在寻找的答案,而且 json 不是一种语言的提醒有助于在上下文中设置问题。
OP的要求非常清楚,这是正确的答案。
A
Alexei Levenkov

我不得不为一个小型 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,但它还有其他缺陷,并且本机不支持。


这是针对特定设置的解决方案,不一定与问题相关。你创建的不是多行字符串(无论如何这是不可能的),而是里面有字符串的数组
这显示了如何在字符串中插入换行符,这不回答问题。 This answer 可以。
fgrieu - 无需添加换行符即可轻松连接字符串。通过这个小改动,它确实为多行字符串提供了一种解决方法(只要您能够控制指定 JSON 模式)。我会尝试用这个来改进答案。
谢谢,我喜欢这个。我会用这个来做我正在做的事情。它看起来整洁有序。我将让这个数组中的每一行都暗示输出文本中的换行符,尽管这个解决方案也适用于不插入换行符的情况。我之前在我的 javascript 源代码中使用过这个解决方案,只是因为我喜欢它的组织方式,以及它对最终字符串中的空白类型没有任何疑问。
谢谢,这解决了我在 VScode 中的 launch.json 中的不同行上有命令行参数的问题。
L
Lightness Races in Orbit

查看the specification! JSON 语法的 char 产生式可以采用以下值:

任何 Unicode 字符,除了-"-or-\-or-control-character

\"

\\

\/

\b

\F

\n

\r

\t

\u 四位十六进制数字

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


这是正确的答案,因为它没有歧义。根据规范,允许使用新行,只要它们使用控制字符正确转义即可。
JSON 中的@AliKhaki \n 不会完成问题所寻求的结果。或者您正在考虑其他内容(即嵌入换行符),或者您正在谈论某种编程语言中字符串文字(包含 JSON)中的换行符,这又是不同的东西。
@LightnessRacesinOrbit 是的,我在字符串中寻找换行符
J
James Gentes

JSON 不允许换行以提高可读性。

你最好的选择是使用一个可以为你换行的 IDE。


像 BBEdit 这样支持“软”换行的编辑器是理想的选择。它将文本换行,使其全部显示在编辑器窗口的可见区域内,但只有您键入的行尾(例如,按回车键)在保存时保留在文件中。使编辑带有非常长的字符串的 JSON 变得更容易,而无需求助于代码技巧或黑客。
有时我认为 JSON 格式没有经过彻底的设计。没有评论,没有多行支持。我知道它只是一种数据格式,但“供人类使用”。因此,一些“人性化”功能会有所帮助。
谢谢你的回答,让我笑了。这实际上是唯一正确的答案,因为 JSON 标准在这里非常严格,因此很难维护很长的文本。为什么我自己没有想出这个简单的解决方案? :-)
@dvdmn 我完全同意。因为它将设计一些 90 岁的程序员,他们在第一次登月之前度过了他最好的时光。
讽刺不是学习平台的最佳场所,尽管我也需要微笑片刻。
N
Neuron

这是一个非常古老的问题,但我在搜索中遇到了这个问题,我想我知道你的问题的根源。

JSON 不允许在其数据中使用“真正的”换行符;它只能逃脱换行符。请参阅 @YOU 中的 answer。根据问题,您似乎试图以两种方式在 Python 中转义换行符:使用续行符 ("\") 或使用 "\n" 作为转义符。

但请记住:如果您在 python 中使用字符串,特殊的转义字符("\t""\n")将被转换为真正的控制字符! "\n" 将替换为代表换行符的 ASCII 控制字符,这正是 JSON 中非法的字符。 (至于换行符,它只是将换行符取出。)

所以你需要做的是防止Python转义字符。您可以通过使用原始字符串(将 r 放在字符串前面,如 r"abc\ndef" 中)或在换行符 ("abc\\ndef") 前面添加一个额外的斜杠来执行此操作。

上述两种方法都不会将 "\n" 替换为真正的换行符 ASCII 控制字符,而是将 "\n" 保留为两个文字字符,然后 JSON 可以将其解释为换行符转义。


S
Sandip Nirmal

将属性值写入字符串数组。就像这里给出的例子 https://gun.io/blog/multi-line-strings-in-json/。这会有所帮助。

我们总是可以将字符串数组用于多行字符串,如下所示。

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

我们可以轻松地迭代数组以多行方式显示内容。


我建议您在链接的答案中添加信息,因为链接将来可能会中断。
但是他们你有一个数组,而不是一个字符串。数组不是字符串。时期。
只是在想这个。好的!
当然,它改变了格式。但是,如果使用 multistring 是为了在 JSON 文件的开头有某种类型的标头用于文档目的,那么它可以正常工作,并且人类可读性是最重要的方面。它看起来更好一些缩进。 pastebin.com/Rs8HSQH5
@BrandonStivers:通常您可以教机器新事物,因此他确实可以将格式指定为数组并说每个数组条目都是一种新行。然后在程序中实现它。您的评论目前是正确的,对于提问者根本没有要求的特定用例。无论如何,总的来说,这是一个很好的提示——提议的解决方案现在不能在所有情况下都适用。
c
ced-b

虽然不是标准的,但我发现一些 JSON 库具有支持多行字符串的选项。我这样说是要警告的,这会损害您的互操作性。

然而,在我遇到的特定场景中,我需要制作一个仅由一个系统使用过的配置文件,该文件可供人类阅读和管理。并最终选择了这个解决方案。

以下是使用 Jackson 在 Java 上的效果:

JsonMapper mapper = JsonMapper.builder()
   .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
   .build()

G
Gambitier

您可以在客户端编码并在服务器端解码。这也将处理 \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>

Y
Yoz

如果只是为了在您的编辑器中进行演示,您可以使用 ` 而不是 " 或 '

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`);

将放入控制台:第一行第二行

希望这回答了你的问题。


M
Mukesh Kumar

试试这个,它还可以处理 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');
}

问题是问是否有可能有一个多行字符串