You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用YAML折叠>语法表示JSON字符串出现意外换行如何解决

问题原因
  • 你遇到的现象是因为对YAML折叠字符串(>-)的规则适用前提理解不全导致的。YAML 1.2.2规范中「相邻行之间的换行替换为空格、不插入换行」的规则,仅适用于与折叠块基准缩进一致的连续非空行。
  • 你的示例中,>-块的基准缩进是第一行{的缩进深度,后续JSON键值对行的缩进比基准缩进多了2个空格,属于「额外缩进的行」,这类行的末尾换行不会被折叠替换,会原样保留,所以解析后会出现多余的\n。
  • 这是YAML规范的预设行为,并非解析器的Bug,所以你在多个不同语言的YAML库中都能复现该现象。
解决方案

如果你需要使用折叠字符串存储JSON、且不引入额外换行,有两种常用方案:

方案1:统一折叠块内所有行的缩进

将折叠块内的所有行的缩进调整为和基准缩进(也就是>-后第一行的缩进)完全一致,不要给JSON内部的行额外增加缩进,示例如下:

- yaml: >-
    {
    "This" : "is supposed to be a JSON string.",
    "it" : "is not meant to be a yaml map itself.",
    "And": "if this string were passed into",
    "a": "json parser, it would THEN parse as a JSON map.",
    "The": "confusing part to me is the newlines.",
    "Normally": ">- folded style strings do not introduce",
    "newline": "characters between lines within the yaml",
    "folded": "There shouldn't be any newlines added.",
    "But": "several unexpected newlines are introduced.",
    "Does": "This have something to do with the special",
    "characters": "in the string?"
    }

这种写法解析后,所有行之间的换行都会被替换为单个空格,不会出现多余的\n,同时保留YAML配置的可读性。

方案2:直接使用引号包裹JSON字符串

如果你需要100%精确控制字符串内容,完全避免YAML自动调整换行、空格,可以直接用单引号/双引号将整个JSON包裹为单行标量:

  • 用单引号包裹:内部的双引号不需要转义,仅内部出现单引号时需要重复两次转义,适合JSON场景:
- yaml: '{ "This": "is supposed to be a JSON string.", "it": "is not meant to be a yaml map itself." }'
  • 用双引号包裹:内部的双引号需要加\转义,可以支持\n、\t等转义字符:
- yaml: "{ \"This\": \"is supposed to be a JSON string.\", \"it\": \"is not meant to be a yaml map itself.\" }"
补充说明
  • >-中的>表示启用折叠模式,末尾的-表示移除整个字符串末尾的换行符,如果不加-,解析后的字符串末尾会多一个\n。
  • 如果需要保留原有换行,可以使用|-块标量,会原样保留所有换行,仅移除末尾的多余换行。

内容的提问来源于stack exchange,提问作者Alex Amato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:06:02