📜  在Python中展平 JSON 对象(1)

📅  最后修改于: 2023-12-03 15:23:26.790000             🧑  作者: Mango

在Python中展平JSON对象

在Python中,JSON是一种非常常用的数据格式,然而当我们需要对JSON对象进行处理的时候,有时候会遇到需要将嵌套结构的JSON对象展平成键值对的情况。这个过程也被称为“flatten”。

方案一:使用递归

最常见的解决方案是使用递归。这种方法进行操作的依据是嵌套的JSON对象可以视为树状结构。每个嵌套的JSON对象都有一个“node”或“parent”和一个或多个子节点。

以下是使用递归来展平嵌套JSON对象的代码片段:

def flatten_json(nested_json):
    out = {}
    
    def flatten(sub_json, name=''):
        if type(sub_json) is dict:
            for sub_key in sub_json:
                flatten(sub_json[sub_key], name + sub_key + '.')
        elif type(sub_json) is list:
            i = 0
            for sub_elem in sub_json:
                flatten(sub_elem, name + str(i) + '.')
                i += 1
        else:
            out[name[:-1]] = sub_json
            
    flatten(nested_json)
    return out

该函数接受一个嵌套的JSON对象,并返回一个已展平的键值对。您可以使用以下代码测试该函数:

import json

nested_json = {
    'a': {
        'b': {
            'c': 1,
            'd': 2
        }
    },
    'e': [3, 4],
    'f': {
        'g': 'hello'
    }
}

flat_json = flatten_json(nested_json)
print(json.dumps(flat_json, indent=4))

输出:

{
    "a.b.c": 1,
    "a.b.d": 2,
    "e.0": 3,
    "e.1": 4,
    "f.g": "hello"
}
方案二:使用jsonpath

jsonpath是一种语法,在JSON对象中通过路径查询或筛选数据。可以使用jsonpath.flatten函数将JSON对象展平为键值对格式。

以下是使用jsonpath.flatten函数将嵌套JSON对象展平成键值对的代码片段:

import json
from jsonpath_ng import jsonpath, parse
from jsonpath_ng.ext import parse

nested_json = {
    'a': {
        'b': {
            'c': 1,
            'd': 2
        }
    },
    'e': [3, 4],
    'f': {
        'g': 'hello'
    }
}

jsonpath_expr = parse('$..*')
flat_json = {match.full_path: match.value for match in jsonpath_expr.find(nested_json)}
print(json.dumps(flat_json, indent=4))

该函数使用jsonpath语法查询JSON对象的所有键和值,然后将它们一一展开为键值对。

输出:

{
    "['a']['b']['c']": 1,
    "['a']['b']['d']": 2,
    "['e'][0]": 3,
    "['e'][1]": 4,
    "['f']['g']": "hello"
}
总结

本文介绍了两种将嵌套的JSON对象展平为键值对的方法。使用递归的方法需要自己实现,但可以完全掌控展开的过程。使用jsonpath函数需要安装jsonpath和jsonpath-ng扩展,但可以更快地展开JSON对象。请选择适合您的需求和情况的方式。