使用 PyYaml 将 JSON 转储为 Python 中的多行字符串

问题描述 投票:0回答:1

我需要使用一些 Kubernetes 资源进行往返,以使用 Python (3.11) 以某种方式对其进行更改。 现在我没有关注 ConfigMap-Resource:

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-map
data:
  sample.json: |-
    [
      {
        "name": "foo",
        "description": "bar"
      }
    ]

加载并更改它后,我想将其转储回来,同时保留以前的形式。不幸的是,我只得到以下输出:

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-map
data:
  sample.json: "[\n {\n "name": "foo",\n"description": "bar"\n}\n]"

我尝试了各种方法,但没有任何运气,例如使用不同的代表组合,如https://github.com/yaml/pyyaml/issues/240所示 有谁知道如何做到这一点? 非常感谢!

python pyyaml
1个回答
0
投票

使用

yaml.add_representer
指示要用于渲染字符串的函数。 (这里使用的特定代表也取自第 240 期。)

def str_presenter(dumper, data):
    """configures yaml for dumping multiline strings                                     Ref: https://stackoverflow.com/questions/8640959/how-can-i-control-what-scalar-form-pyyaml-uses-for-my-data"""
    if data.count('\n') > 0:  # check for multiline string
        return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
    return dumper.represent_scalar('tag:yaml.org,2002:str', data)


yaml.add_representer(str, str_presenter)

print(yaml.dump(d))

(但请注意,这不会保留键的原始顺序。我不记得这是否可能,但我认为这超出了这个问题的范围。)

© www.soinside.com 2019 - 2024. All rights reserved.