【问题标题】:How to normalize complex nested json in python?如何在python中规范化复杂的嵌套json?
【发布时间】:2017-04-07 14:18:22
【问题描述】:

我正在尝试在 python 中规范化复杂的嵌套 json,但我无法解析出所有对象。

我正在引用此页面中的代码。 https://medium.com/@amirziai/flattening-json-objects-in-python-f5343c794b10

sample_object = {'Name':'John', 'Location':{'City':'Los Angeles','State':'CA'}, 'hobbies':['Music', 'Running']}

def flatten_json(y):
    out = {}

    def flatten(x, name=''):  

        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            for a in x:
                flatten(a, name)
        else:
            out[name[:-1]] = x

    flatten(y)

    return out
flat = flatten_json(sample_object)
print json_normalize(flat)

返回结果

Name | Location_City | Location_State | Hobbies
-----+---------------+----------------+--------
John | Los Angeles   | CA             | Running

预期结果:

Name | Location_City | Location_State | Hobbies
-----+---------------+----------------+--------
John | Los Angeles   | CA             | Running
John | Los Angeles   | CA             | Music

【问题讨论】:

    标签: python json loops nested-loops


    【解决方案1】:

    您遇到的问题源于以下部分

    elif type(x) is list:
        for a in x:
            flatten(a, name)
    

    因为您不会更改列表中每个元素的名称,所以每个下一个元素都会覆盖前一个元素的分配,因此只有最后一个元素会显示在输出中。

    应用于此示例,当展平函数到达列表“爱好”时,它将首先将名称“爱好”分配给元素“音乐”并将其发送到输出。在元素“音乐”之后,列表中的下一个元素是“跑步”,它也将被命名为“爱好”。当这个元素被发送到输出时,它会注意到名字'hobbies'已经存在,它会用值'Running'覆盖值'Music'。

    为了防止这种情况,您引用的链接中的脚本使用以下代码将数组的索引附加到名称,从而为数组的每个元素创建一个唯一的名称。

    elif type(x) is list:
        i = 0
        for a in x:
            flatten(a, name + str(i) + ' ')
            i += 1
    

    这将为数据创建一个额外的“列”,而不是一个新行。如果后者是您想要的,则必须更改功能的设置方式。一种方法是调整函数以返回一个 json 列表(原始 json 中的每个列表元素一个)。

    额外说明:我建议在提交问题时更小心地复制代码。在这种情况下,缩进有点小,因为你遗漏了导入 json_normalize 的部分,所以每个人可能都不清楚你是从 pandas 导入它的

    from pandas.io.json import json_normalize
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2021-12-12
      • 2021-07-23
      • 2017-05-25
      • 2020-06-21
      相关资源
      最近更新 更多