【发布时间】:2021-01-05 13:21:41
【问题描述】:
我有一个嵌套的 JSON
{
"ID": 300,
"Name": " TEST",
"Value": [
{
"Details": [
{
"Name": "TEST1",
"Value": "XXXXXX"
},
{
"Name": "TEST2",
"Value": "DDDDDDDD"
}
],
"Time": [ 1600358400, 1600358700, 1600359000],
"Values": [ 0, 0, 0]
}
]
}
我想展平 json 以便能够获得类似的列表
我使用了 itertools groupby 但无法达到预期的效果。它水平变平。
到目前为止我尝试过的代码
from itertools import groupby
import json
def myflatten(d, depth=0):
rv = [({}, depth)]
if isinstance(d, dict):
for k, v in d.items():
if not isinstance(v, dict) and not isinstance(v, list):
for i in rv:
i[0][k] = v
else:
for (vv, _depth) in myflatten(v,depth+1):
rv.append((rv[-1][0].copy(), _depth))
for kkk, vvv in vv.items():
rv[-1][0][kkk] = vvv
elif isinstance(d, list):
for v in d:
rv.append((rv[-1][0].copy(), depth+1))
for (vv, _) in myflatten(v,depth+1):
for kkk, vvv in vv.items():
rv[-1][0][kkk] = vvv
for i, _depth in rv:
yield i, _depth
out = []
a = {
"ID": 300,
"Name": " TEST",
"Value": [
{
"Details": [
{
"Name": "TEST1",
"Value": "XXXXXX"
},
{
"Name": "TEST2",
"Value": "DDDDDDDD"
}
],
"Time": [ 1600358400, 1600358700, 1600359000],
"Values": [ 0, 0, 0]
}
]
}
for v, g in groupby(sorted(myflatten(a), key=lambda k: -k[1]), lambda k: k[1]):
out.extend(i[0] for i in g)
break
print(out)
有人可以帮助将嵌套的 json/dict/list 垂直而不是水平展平吗?最终目标是能够将数据存储在 RDBMS 中,而不必无限增加列数,而是增加行数。
【问题讨论】:
-
您的代码缩进不正确。请解决这个问题。另外,请发布您现在得到的内容,并通过创建minimal reproducible example 缩小错误来源
-
在 Pranav 的指导下编辑了代码
-
@nomad 请指定您想要的输出。由于无法推断 您 想要的结构,因此图像不计入...您希望它是列表列表吗?
-
您是想总体上展平,还是使用输入的领域知识? zip(详细信息,值)呢?这看起来像是领域知识,尽管我们可以自动压缩最外层列表下方的任何列表。
标签: python json nested flatten