python - json ,如何制作 json 平面

python - json , how to make a json flat

所以我有一个包含两个组的嵌套 json,每个组都有一个包含更多子组的字段 我想弹出所有子组以展平 json 并删除子组字段

正确的做法是什么

JSON :

[
    {
        "groupId": "a_group",
        "version": "2.0.1",
        "type": "jar",
        "sub_group": [
            {
                "groupId": "a_1",
                "version": "2.0.0",
                "type": "jar",
                "sub_group": []
            },
            {
                "groupId": "a_2",
                "version": "2.0.1",
                "type": "jar",
                "sub_group": [
                                {
                                "groupId": "a_1",
                                "version": "2.0.0",
                                "type": "jar",
                                "sub_group": []
                                },
                ],
            }
        ],
    },
    {
        "groupId": "c_group",
        "version": "1.9.1",
        "type": "jar",
        "sub_group": [
                    {
                "groupId": "a_1",
                "version": "2.0.0",
                "type": "jar",
                "sub_group": []
            },
        ],
    },
}

这是预期的结果: 我需要弹出所有子组并使它们显示为平面 json 像这样

[{
        "groupId": "a_group",
        "version": "2.0.1",
        "type": "jar",
        "sub_group": []
    },
    {
        "groupId": "a_1",
        "version": "2.0.0",
        "type": "txt",
        "sub_group": []
    },
    {
        "groupId": "a_2",
        "version": "2.0.1",
        "type": "jar",
        "sub_group": []
    },
    {
        "groupId": "c_group",
        "version": "1.9.1",
        "type": "jar",
        "sub_group": []
    },
]

好吧,我有一个面试问题与你的问题非常相似

这是我的回答:

def flatten_json(self,json_data) ->json:
    '''
    :param json_data: The json file to work on
    :return: A json
    '''

    out = []
    def flatten(key):
        if isinstance(key, dict):
            if key['sub_group']:
                flatten(key['sub_group'])
                key['sub_group'] = []
                out.append(key)
            else:
                out.append(key)

        # in case we have multiple items in the list[]
        elif isinstance(key, list):
            for val in key:
                flatten(val)

    flatten(json_data)
    return json.dumps(out)

这不是最好的解决方案,但效果很好 我冒昧地假设 sub_group 的名称始终是子组 我使用了递归并且我正在使用 isinstance 方法处理移动到字典中以检查我是否正在查看字典,如果不是那么这意味着我有一个包含其他内容的列表 我在 elif 部分处理它并遍历列表中的每个项目