有没有办法在不知道其结构的情况下将 json 文件值平展到列表中?



我正在构建一个基于API的网站,我正在尝试设计一个通用函数,该函数将获得一个json文件,并将其所有值解析为一个列表,而不知道前面的json结构(每个对象可以包含dict、list或tuple,而tuple也可以包含dict's list和tuple's(

我已经找了好几天的解决方案,但什么都没找到。

我尝试了两种方法,我将添加这两个函数供您查看,并添加一个我想要解析的json文件的示例。

方法1:此方法返回包含其他类型的dict的结果

def format_data(self,args):
result =[]
for arg in args:
if isinstance(args[arg], dict):
self.format_data(args[arg])
# for val in self.format_data(args[arg]):
#     result.append(val)
if isinstance(args[arg], tuple) or isinstance(args[arg], list):
for val in args[arg]:
result.append(val)
else:
result.append(args[arg])
return result

方法2:使用这个方法,我尝试构建一个递归函数,该函数只会在对象只包含str和str值时追加对象,否则;继续打电话此方法不会返回完整的值列表。

def format_data(self,args):
result =[]
for arg in args:
if isinstance(arg, dict):
self.format_data(arg)
elif isinstance(args[arg],dict):
self.format_data(args[arg])
elif isinstance(args[arg], list) or isinstance(args[arg], tuple):
for val in args[arg]:
if isinstance(args[arg], str):
result.append(val) #copy only vlues with str type in the object
if self.check_if_only_string(args[arg]): #locate all values dif then str that contain's str and copy them
for val in args[arg]:
result.append(val)
else:
self.format_data(args[arg]) #args[arg] must be str
result.append(args[arg])
return result
def check_if_only_string(self, data):
'''retuens flase if data obj has any kind of objects other then str'''
for key in data:
if isinstance(key, dict):
return False
elif not isinstance(key, str):
return False
return True

用于输入和输出的ex.:输入:

{
"timezone": "UTC",
"serverTime": 1637752583921,
"rateLimits": [
{
"rateLimitType": "REQUEST_WEIGHT",
"interval": "MINUTE",
"intervalNum": 1,
"limit": 1200
},
{
"rateLimitType": "ORDERS",
"interval": "SECOND",
"intervalNum": 10,
"limit": 50
},
{
"rateLimitType": "ORDERS",
"interval": "DAY",
"intervalNum": 1,
"limit": 160000
},
{
"rateLimitType": "RAW_REQUESTS",
"interval": "MINUTE",
"intervalNum": 5,
"limit": 6100
}
],
"exchangeFilters": [],
}

输出:

[UTC,1637752583921,REQUEST_WEIGHT,MINUTE,1,1200,ORDERS]

依此类推到所有值

在我看来,这似乎只是在树中寻找深度优先搜索,以生成树的叶子列表。

def leaves(t):
if isinstance(t, dict):
for v in t.values():
yield from leaves(v)
elif isinstance(t, list):
for v in t:
yield from leaves(v)
else:
yield t
print( list(leaves(json.loads(example))) )
# ['UTC', 1637752583921, 'REQUEST_WEIGHT', 'MINUTE', 1, 1200, 'ORDERS', 'SECOND', 10, 50, 'ORDERS', 'DAY', 1, 160000, 'RAW_REQUESTS', 'MINUTE', 5, 6100]

最新更新