【问题标题】:Flattening json documents with multiple occurences stacked扁平化 json 文档,多次出现堆叠
【发布时间】:2020-11-16 23:29:35
【问题描述】:

我想在一个表中转换一些 json 文件或 dict 对象,以便进行 sql 查询。

我已经找到了几个很棒的话题,但似乎没有一个能回答我的问题:
Python flatten multilevel/nested JSON
Flatten nested dictionaries, compressing keys

在我的情况下,我有 json 文件,这些文件将每个出现的事件都以相同的结构堆叠在这样的列表中:

[{
    "_id": "some_id_value",
    "time": {
        "$date": "2019-12-28"
    },
    "boolean_key": false,
    "data_stacked": [{
        "name": "task1",
        "time": {
            "$date": "2019-12-28"
        },
        "time_spent": 2.2,
        "size": {
            "$number": "0"
        },
        "other": {}
    }, {

        "name": "task2",
        "time": {
            "$date": "2019-12-28"
        },
        "time_spent": 2.7,
        "size": {
            "$number": "0"
        },
        "other": {}

    }]

},
{
    "_id": "some_other_id_value",
    "time": {
        "$date": "2019-12-30"
    },
    "boolean_key": true,
    "data_stacked": [{
        "name": "task3",
        "time": {
            "$date": "2019-12-30"
        },
        "time_spent": 3.4,
        "size": {
            "$number": "0"
        },
        "other": {}
    }, {

        "name": "task4",
        "time": {
            "$date": "2019-12-30"
        },
        "time_spent": 4.1,
        "size": {
            "$number": "0"
        },
        "other": {}

    }]




}]

我想迭代代表标准属性的第一个键

[       
    {
    "_id": "some_id_value",
    "time.$date": "2019-12-28"
    "boolean_key": false,
    "data_stacked.name": "task1",
    "data_stacked.time.$date": "2019-12-28"
    "data_stacked.time_spent": 2.2,
    "data_stacked.size.$number": "0"
    "data_stacked.other": {}
    }, 
    {
    "_id": "some_id_value",
    "time.$date": "2019-12-28"
    "boolean_key": false,
    "data_stacked.name": "task2",
    "data_stacked.time.$date": "2019-12-28"
    "data_stacked.time_spent": 2.7,
    "data_stacked.size.$number": "0"
    "data_stacked.other": {}
    },
    {

    "_id": "some_other_id_value",
    "time.$date": "2019-12-30"
    "boolean_key": true,
    "data_stacked.name": "task3",
    "data_stacked.time.$date": "2019-12-30"
    "data_stacked.time_spent": 3.4,
    "data_stacked.size.$number": "0"
    "data_stacked.other": {}
    }, 
    {
    "_id": "some_other_id_value",
    "time.$date": "2019-12-30"
    "boolean_key": true,
    "data_stacked.name": "task4",
    "data_stacked.time.$date": "2019-12-30"
    "data_stacked.time_spent": 4.1,
    "data_stacked.size.$number": "0"
    "data_stacked.other": {}

    }]

我在这里发现了一个类似的案例:https:How to flatten up embedded JSON into multiple documents
但是我没有成功运行这个示例,我之前从未使用过js,所以我不知道缺少什么。

在我最后一次尝试中,我尝试循环键:

tryjson = json.load(testjson)
def flatten_json2(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:
        i = 0
        for a in x:
            flatten(a, name + str(i) + '_')
            i += 1
    else:
        out[name[:-1]] = x

flatten(y)
return out
   import pprint
for i in tryjson:
test=(i['_id'] ,flatten_json2(i['data_stacked']))
print(test)

结果不好,_id 键丢失,因为我只查找 _id 值(我不知道如何返回特定字段的键和值),堆叠的数据似乎排序正确但整个对象是一个元组,所以我也不能使用 json_normalize

您有解决此问题的方法吗?
最好的问候。

【问题讨论】:

    标签: python json nested-lists flatten


    【解决方案1】:

    如果我从 mongodb 查询结果开始,我认为 json_normalize 应该就足够了,比如 $unwind:"data_stacked,time" 和

     $project: {
            _id: 1,
            "time.$date": 1,
            "data_stacked.name": 1,
            ...
        }
    

    也许是 $group 而不是 $project,因为我想在每个对象中返回 _id?无论如何,我现在无法测试此选项,所以我仍在寻找解决方案。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2011-11-15
      • 2014-01-29
      • 2019-04-24
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多