当前位置: 首页 > 面试题库 >

如何使用flatten_json递归地扁平化嵌套的JSON?

哈扬
2023-03-14
问题内容

此问题特定于flatten_json从[GitHub

Repo使用:flatten](https://github.com/amirziai/flatten)

  • 该软件包位于pypi flatten-json 0.1.7上,可以与pip install flatten-json
  • 此问题特定于软件包的以下组件:
    def flatten_json(nested_json: dict, exclude: list=[''], sep: str='_') -> dict:
        """
        Flatten a list of nested dicts.
        """
        out = dict()
        def flatten(x: (list, dict, str), name: str='', exclude=exclude):
            if type(x) is dict:
                for a in x:
                    if a not in exclude:
                        flatten(x[a], f'{name}{a}{sep}')
            elif type(x) is list:
                i = 0
                for a in x:
                    flatten(a, f'{name}{i}{sep}')
                    i += 1
            else:
                out[name[:-1]] = x

        flatten(nested_json)
        return out

使用递归展平嵌套 dicts

  • 用Python递归思考
  • 在Python中展平JSON对象

嵌套如何data?:

  • flatten_json 已用于解压缩最终超过100000列的文件

展平的JSON是否可以展平?

  • 是的,这个问题不能解决这个问题。但是,如果您安装flatten软件包,则有一种unflatten方法,但我尚未对其进行测试。

问题答案:
  • 此答案集中于使用flatten_json递归展平嵌套dictJSON

假设:

  • 该答案假定您已经将JSONdict加载到了某个变量(例如,文件,api等)中
    • 在这种情况下,我们将使用 data

如何data加载到flatten_json

  • 它接受一个dict,如功能类型提示所示。

最常见的形式data

  • 只是一句话: {}
    • flatten_json(data)
  • 字典列表: [{}, {}, {}]
    • [flatten_json(x) for x in data]
  • 带有顶级密钥的JSON,其中值重复: {1: {}, 2: {}, 3: {}}
    • [flatten_json(data[key]) for key in data.keys()]
  • 其他
    • {'key': [{}, {}, {}]}[flatten_json(x) for x in data['key']]

实际示例:

  • 我通常会扁平data化成pandas.DataFrame
    • pandasimport pandas as pd

资料1:

{
    "id": 1,
    "class": "c1",
    "owner": "myself",
    "metadata": {
        "m1": {
            "value": "m1_1",
            "timestamp": "d1"
        },
        "m2": {
            "value": "m1_2",
            "timestamp": "d2"
        },
        "m3": {
            "value": "m1_3",
            "timestamp": "d3"
        },
        "m4": {
            "value": "m1_4",
            "timestamp": "d4"
        }
    },
    "a1": {
        "a11": [

        ]
    },
    "m1": {},
    "comm1": "COMM1",
    "comm2": "COMM21529089656387",
    "share": "xxx",
    "share1": "yyy",
    "hub1": "h1",
    "hub2": "h2",
    "context": [

    ]
}

展平1:

    df = pd.DataFrame([flatten_json(data)])

     id class   owner metadata_m1_value metadata_m1_timestamp metadata_m2_value metadata_m2_timestamp metadata_m3_value metadata_m3_timestamp metadata_m4_value metadata_m4_timestamp  comm1               comm2 share share1 hub1 hub2
      1    c1  myself              m1_1                    d1              m1_2                    d2              m1_3                    d3              m1_4                    d4  COMM1  COMM21529089656387   xxx    yyy   h1   h2

资料2:

[{
        'accuracy': 17,
        'activity': [{
                'activity': [{
                        'confidence': 100,
                        'type': 'STILL'
                    }
                ],
                'timestampMs': '1542652'
            }
        ],
        'altitude': -10,
        'latitudeE7': 3777321,
        'longitudeE7': -122423125,
        'timestampMs': '1542654',
        'verticalAccuracy': 2
    }, {
        'accuracy': 17,
        'activity': [{
                'activity': [{
                        'confidence': 100,
                        'type': 'STILL'
                    }
                ],
                'timestampMs': '1542652'
            }
        ],
        'altitude': -10,
        'latitudeE7': 3777321,
        'longitudeE7': -122423125,
        'timestampMs': '1542654',
        'verticalAccuracy': 2
    }, {
        'accuracy': 17,
        'activity': [{
                'activity': [{
                        'confidence': 100,
                        'type': 'STILL'
                    }
                ],
                'timestampMs': '1542652'
            }
        ],
        'altitude': -10,
        'latitudeE7': 3777321,
        'longitudeE7': -122423125,
        'timestampMs': '1542654',
        'verticalAccuracy': 2
    }
]

展平2:

    df = pd.DataFrame([flatten_json(x) for x in data])

     accuracy  activity_0_activity_0_confidence activity_0_activity_0_type activity_0_timestampMs  altitude  latitudeE7  longitudeE7 timestampMs  verticalAccuracy
           17                               100                      STILL                1542652       -10     3777321   -122423125     1542654                 2
           17                               100                      STILL                1542652       -10     3777321   -122423125     1542654                 2
           17                               100                      STILL                1542652       -10     3777321   -122423125     1542654                 2

资料3:

{
    "1": {
        "VENUE": "JOEBURG",
        "COUNTRY": "HAE",
        "ITW": "XAD",
        "RACES": {
            "1": {
                "NO": 1,
                "TIME": "12:35"
            },
            "2": {
                "NO": 2,
                "TIME": "13:10"
            },
            "3": {
                "NO": 3,
                "TIME": "13:40"
            },
            "4": {
                "NO": 4,
                "TIME": "14:10"
            },
            "5": {
                "NO": 5,
                "TIME": "14:55"
            },
            "6": {
                "NO": 6,
                "TIME": "15:30"
            },
            "7": {
                "NO": 7,
                "TIME": "16:05"
            },
            "8": {
                "NO": 8,
                "TIME": "16:40"
            }
        }
    },
    "2": {
        "VENUE": "FOOBURG",
        "COUNTRY": "ABA",
        "ITW": "XAD",
        "RACES": {
            "1": {
                "NO": 1,
                "TIME": "12:35"
            },
            "2": {
                "NO": 2,
                "TIME": "13:10"
            },
            "3": {
                "NO": 3,
                "TIME": "13:40"
            },
            "4": {
                "NO": 4,
                "TIME": "14:10"
            },
            "5": {
                "NO": 5,
                "TIME": "14:55"
            },
            "6": {
                "NO": 6,
                "TIME": "15:30"
            },
            "7": {
                "NO": 7,
                "TIME": "16:05"
            },
            "8": {
                "NO": 8,
                "TIME": "16:40"
            }
        }
    }
}

展平3:

    df = pd.DataFrame([flatten_json(data[key]) for key in data.keys()])

       VENUE COUNTRY  ITW  RACES_1_NO RACES_1_TIME  RACES_2_NO RACES_2_TIME  RACES_3_NO RACES_3_TIME  RACES_4_NO RACES_4_TIME  RACES_5_NO RACES_5_TIME  RACES_6_NO RACES_6_TIME  RACES_7_NO RACES_7_TIME  RACES_8_NO RACES_8_TIME
     JOEBURG     HAE  XAD           1        12:35           2        13:10           3        13:40           4        14:10           5        14:55           6        15:30           7        16:05           8        16:40
     FOOBURG     ABA  XAD           1        12:35           2        13:10           3        13:40           4        14:10           5        14:55           6        15:30           7        16:05           8        16:40


 类似资料:
  • 注意:这个问题被简单地标记为这个问题的重复,但它不是完全的重复,因为我是专门询问std::optionals的。如果你关心一般情况,还是一个很好的问题。 假设我有嵌套的选项,如下所示(愚蠢的玩具示例): 还有这个垃圾邮件功能: 什么是压扁这张可选支票的最佳方法?我做了这样的东西,它不是可变的,但我不太关心这个(如果真的需要,我可以再添加一个级别(用),而且超出这个级别的所有东西都是可怕的代码)。

  • 如我们所知,要使用方法对数组进行展平 那么如何将这个数组平坦化为呢?

  • 问题内容: 我有一个方法必须执行以下操作: 我想指定嵌套的数量(在上述情况下,我希望嵌套15个)。这里有一种使用递归编程的方法吗? 问题答案: 是。这可以通过递归编程来执行。 我假设您不喜欢在源代码中写下这些嵌套的代码-如您的示例所示,因为这确实是丑陋的编程-如评论员所解释。 下面的代码(类似于Java的伪代码)对此进行了说明。我假设嵌套的深度固定。然后,您实际上想循环遍历尺寸深度的整数向量。 数

  • 本文向大家介绍Python中的扁平化嵌套列表迭代器,包括了Python中的扁平化嵌套列表迭代器的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个嵌套的整数列表;我们必须实现一个迭代器以使其扁平化。每个元素可以是整数,也可以是列表。该列表的元素也可以是整数或其他列表。因此,如果输入类似于[[1,1],2,[1,1]],则输出将为[1,1,2,1,1,1] 为了解决这个问题,我们将遵循以下步骤-

  • 问题内容: 我需要将复杂的JSON Blob反序列化为标准.NET容器,以便 在不了解JSON的代码中 使用。它期望的事情是在标准的.NET类型,具体地或其中“对象”可以是原语或递归(词典或列表)。 我不能使用静态类型来映射结果,并且JObject / JToken不适合。理想情况下,将有某种方式(也许通过Contracts?)将原始JSON转换为基本.NET容器。 我一直在寻找任何方法来诱使JS

  • 问题内容: 我是一名编程新手,在理解python教科书(Magnus Lie Hetland的“ Beginning Python”)中的示例时遇到了一些麻烦。该示例针对的是递归生成器,该生成器旨在展平嵌套列表的元素(具有任意深度): 然后,您将输入嵌套列表,如下所示: 我了解flatten()中的递归如何帮助缩小到此列表的最内层元素“ 1”,但是我不明白的是当“ 1”实际上作为“嵌套”传递回fl