转换JSON键和值

时间:2019-07-24 23:37:37

标签: python json

我在python中有一个简单的json,看起来像:

{
    "list": [{
            "key1": "value1"
        },
        {
            "key1": "value1"
        }
    ]
}

我想将其转换为以下json。有什么建议可以在不安装其他库的情况下使用python进行操作吗?

{
    "list": [{
        "keys": {
            "name": "key1",
            "value": "value1"
        }
    }, {
        "keys": {
            "name": "key1",
            "value": "value1"
        }
    }]
}

2 个答案:

答案 0 :(得分:0)

从您的问题中不确定是否已经将json读入变量,或者它是否在文件中。假设您已经将其包含在变量中:

in_json = {
    "list": [{
            "key1": "value1"
        },
        {
            "key2": "value2"
        }
    ]
}

out_json = {"list":[]}
for kd in in_json["list"]:
    sub_kd = {"keys": {}}
    for k,v in kd.iteritems():
        sub_kd["keys"]["name"] = k
        sub_kd["keys"]["value"] = v

    out_json["list"].append(sub_kd)

print(out_json)

它只是循环遍历json制作字典以追加到out_json字典中。您可以使用json库使打印效果漂亮,并使用它保存到文件中

答案 1 :(得分:0)

您没有确切说明其中包含JSON数据的内容,因此我将其全部放在下面的示例代码中的字符串中,并使用http://127.0.0.1:4000函数将其转换为Python字典。如果在文件中,则可以使用模块的json.loads()函数。

它还假设"list"列表中的每个子JSON对象仅包含一个键/值对,如您的问题所示。

下面的代码就地更改了反序列化字典 ,并通过使用json.load()函数对其进行了序列化,漂亮地打印了该结果。

请注意,我稍微更改了示例输入JSON中的键和值,以使其更易于查看其与打印结果之间的对应关系。

import json


json_in = '''
    {
        "list": [
            {
                "key1": "value1"
            },
            {
                "key2": "value2"
            }
        ]
    }
'''

json_data = json.loads(json_in)  # Deserialize.

for i, obj in enumerate(json_data['list']):
    # Assumes each object in list contains only one key, value pair.
    newobj = { 'name': next(iter(obj.keys())),
              'value': next(iter(obj.values()))}
    json_data['list'][i] = {'keys': newobj}

print(json.dumps(json_data, indent=4))  # Reserialize and print.

打印结果:

{
    "list": [
        {
            "keys": {
                "name": "key1",
                "value": "value1"
            }
        },
        {
            "keys": {
                "name": "key2",
                "value": "value2"
            }
        }
    ]
}