gpt4 book ai didi

JSON 到 YAML : convert fields with embedded newlines "\n" to literal block "|"

转载 作者:行者123 更新时间:2023-12-01 23:08:16 24 4
gpt4 key购买 nike

如何将 JSON 文件,其中一些字段值是多行字符串,带有嵌入的换行符(如“\n”)转换为 YAML,其中带有嵌入换行符的值并且只有那些值是使用文字写入的方 block 符号。

例如给定以下 JSON:

{
"01ea672a": {
"summary": "A short one-line summary",
"description": "first line\nsecond line",
"content": "1st line\n2nd line\n"
}
}

应该生成类似于以下 YAML 的内容(细节可能有所不同):

---
01ea672a:
summary: A short one-line summary
description: |-
first line
second line
content: |
1st line
2nd line

我更喜欢使用脚本语言解决方案,无论是 Python、Perl、Ruby 还是其他语言,或者使用像 Catmandu 这样的命令行转换工具。 .

json2yaml.com在线可以做到这一点,但我不想尝试将它用于 40 MB 的文件。

最佳答案

ruamel.yaml(免责声明:我是那个库的作者),已经可以在不丢失任何信息的情况下往返您的预期输出(包括按键顺序):

import sys
import ruamel.yaml

yaml_str = """---
01ea672a:
summary: A short one-line summary
description: |-
first line
second line
content: |
1st line
2nd line
"""

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

给予:

---
01ea672a:
summary: A short one-line summary
description: |-
first line
second line
content: |
1st line
2nd line

如果你要添加:

    print(type(data['01ea672a']['description']), type(data['01ea672a']))

您会看到这些分别是 ruamel.yaml.scalarstring 中的 LiteralStringScalarCommentedMap 来自 ruamel.yaml.comments。后者你可以即时创建通过将类型交给 JSON 加载器,它将保留键顺序,因为它的行为类似于 ordereddict。

前者加载后必须“强制执行”,因为 json.loads 没有“parse_string”选项,可以在加载期间执行此操作。ruamel.yaml 有一个实用函数 walk_tree 可以做到这一点。

有了这些知识,从 JSON 到 YAML 的干净转换就变得微不足道了:

import sys
import ruamel.yaml
import json

json_str = r"""
{
"01ea672a": {
"summary": "A short one-line summary",
"description": "first line\nsecond line",
"content": "1st line\n2nd line\n"
}
}
"""

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True

data = json.loads(json_str, object_pairs_hook=ruamel.yaml.comments.CommentedMap)
ruamel.yaml.scalarstring.walk_tree(data)

yaml.dump(data, sys.stdout)

再次准确给出您期望的输出。

关于JSON 到 YAML : convert fields with embedded newlines "\n" to literal block "|",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47182204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com