【发布时间】: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