【问题标题】:YAML structured on key/value format to JSONYAML 以键/值格式构建为 JSON
【发布时间】:2021-07-21 23:20:42
【问题描述】:

我在下面有这个 yaml 文件。我需要保留 yaml 文件的这种结构。 在文件中有一些嵌套键/值的特殊性(如personalinfo and more)和一些没有值的嵌套键(如extra)。
键/值的数量是任意的,因为父母的数量也是任意的(在这种情况下,父母是personalInfo, more, extra)。

name: person1
personalInfo:
  - key: address
    value: street 1
  - key: age
    value: 10
  - key: school
    value: XYZ
more:
  - key: mother
    value: Samantha
extra:
 - key: a
 - key: b

我想从这个 yaml 生成一个格式如下的 Json,但我不知道如何实现。

'{"personalInfo" : {"address": "street 1", "age": "10", "school": "XYZ"}, "more":{"mother": "Samantha"}, "extra": ["a", "b"]}' "localhost:8080/person1"

【问题讨论】:

    标签: python json yaml pyyaml


    【解决方案1】:

    最简单最纯粹的方法是 PyYaml,可以通过 pip install pyyaml 安装。存在一个普通的 yaml.load() 函数,但始终应首选 yaml.safe_load() ,除非您明确需要提供任意对象序列化/反序列化以避免引入任意代码执行的可能性。

    import yaml
    with open("test.yml", 'r') as stream:
        try:
            data = yaml.safe_load(stream)
        except yaml.YAMLError as exc:
            print(exc)
    

    这会返回:

    {'name': 'person1',
     'personalInfo': [{'key': 'address', 'value': 'street 1'},
      {'key': 'age', 'value': 10},
      {'key': 'school', 'value': 'XYZ'}],
     'more': [{'key': 'mother', 'value': 'Samantha'}],
     'extra': [{'key': 'a'}, {'key': 'b'}]}
    

    你可以试试这个来得到你想要的结果:

    import json
    
    new_data = {}
    
    for i in data:
        if i!='name':    
            temp = {}
            val = []
            for k in data[i]:
                if 'key' in k:
                    try:
                        temp[k['key']] = k['value']
                    except:
                        val.append(k['key'])
            if val:
                new_data[i] = val
            elif temp:
                new_data[i] = temp
            else:
                new_data[i] = data[i]
    
    str1 = json.dumps(new_data)
    str2 = "localhost:8080/"+data['name']
    
    with open("sample.json", "w") as outfile:
        json.dump(str1.replace('"', "'"), outfile)
        json.dump(str2.replace('"', "'"), outfile)
    

    sample.json 中的结果

    "{'personalInfo': {'address': 'street 1', 'age': 10, 'school': 'XYZ'}, 'more': {'mother': 'Samantha'}, 'extra': ['a', 'b']}""localhost:8080/person1"
    

    【讨论】:

    • 谢谢!这解决了我的问题。这意味着我必须在更改我的 json 格式之后使用 python。只是一个问题,在我的 json 上我不想要“名称”。您有删除它的建议吗?谢谢!
    • 我也不想像你建议的那样 {"a": None} 。正如您在我的问题中看到的那样,我想要的是“额外”:[“a”,“b”]”。对此有什么建议吗?谢谢
    • @CatarinaNogueira 已按照建议修改“额外”。顺便说一句,您是否希望结果是这样的:{'person1': {'personalinfo':{},'more':{},'extra':{}}
    • 谢谢,太好了!不,我想问的是 {'personalinfo':{},'more':{},'extra':{}}
    • @CatarinaNogueira 对不起,我没有注意到!我已经编辑了解决方案以提供所需的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多