使用 Python 读取不均匀的 JSON



我有一个程序,它获取一个大型JSON文件并读取结构,抓取键匹配的所有内容,然后将该结构中的许多项目存储到数据库中。问题是,当只有一个项目时,有时结构是关闭的......因此,如下所示:

"stats": {
"first": [
{
"name": "Name1",
"context": "open",
"number": "139"
},
{
"name": "Name2",
"context": "opener",
"number": "135"
}
],
"second": {
"name": "Name1",
"context": "opener",
"amount": "1.5",
"number": "-125"
},
"third": [
{
"name": "Name1",
"context": "open",
"amount": "8.5",
"number": "-110"
},
{
"name": "Name2",
"context": "open",
"amount": "9.0",
"number": "-120"
}
]
}
},

所以,你会注意到第二个只有一个条目,所以它的结构不同......我尝试了比我能想到的更多的条件......如何检查它是否是单个条目并继续前进? 这可能非常简单,我只是不知所措,并不是最好的 Python 数据结构(诚然(。

我正在做的是抓取像 three[0]['name'] 并将其放入数据库中......所以我在第二个节点上尝试时出现索引错误。另外 - 在某些节点中,第二个将有多个...在其他情况下,它不会...完全取决于记录。

我会首先将其解析为 JSON,然后更新您描述的具有"first""second"等键的字典,如下所示:

def repair_dict(d):
for k in list(d):
v = d[k]
if not isinstance(v,list):
d[k] = [v]

因此,它可以修复以下数据:

>>> d = json.loads(data)
>>> d
{'stats': {'third': [{'context': 'open', 'name': 'Name1', 'number': '-110', 'amount': '8.5'}, {'context': 'open', 'name': 'Name2', 'number': '-120', 'amount': '9.0'}], 'second': {'context': 'opener', 'name': 'Name1', 'number': '-125', 'amount': '1.5'}, 'first': [{'context': 'open', 'name': 'Name1', 'number': '139'}, {'context': 'opener', 'name': 'Name2', 'number': '135'}]}}
>>> repair_dict(d['stats'])
>>> d
{'stats': {'third': [{'context': 'open', 'name': 'Name1', 'number': '-110', 'amount': '8.5'}, {'context': 'open', 'name': 'Name2', 'number': '-120', 'amount': '9.0'}], 'second': [{'context': 'opener', 'name': 'Name1', 'number': '-125', 'amount': '1.5'}], 'first': [{'context': 'open', 'name': 'Name1', 'number': '139'}, {'context': 'opener', 'name': 'Name2', 'number': '135'}]}}

或者当漂亮的印刷时:

>>> pprint.pprint(d)
{'stats': {'first': [{'context': 'open', 'name': 'Name1', 'number': '139'},
{'context': 'opener', 'name': 'Name2', 'number': '135'}],
'second': [{'amount': '1.5',
'context': 'opener',
'name': 'Name1',
'number': '-125'}],
'third': [{'amount': '8.5',
'context': 'open',
'name': 'Name1',
'number': '-110'},
{'amount': '9.0',
'context': 'open',
'name': 'Name2',
'number': '-120'}]}}

最新更新