我正在开发一个从Web服务中提取数据的项目。我想分析我从这些不同的调用中获得的JSON响应,这样我就能理解我得到的响应的结构。
例如,查看此响应提供的json:https://jsonplaceholder.typicode.com/users
我希望生成此响应的“架构”或框架,看起来如下所示:
[
{
"id": "Number",
"name": "String",
"username": "String",
"email": "String",
"address": {
"street": "String",
"suite": "String",
"city": "String",
"zipcode": "String",
"geo": {
"lat": "Number",
"lng": "Number"
}
},
"phone": "String",
"website": "String",
"company": {
"name": "String",
"catchPhrase": "String",
"bs": "String"
}
]
有没有人知道我可以通过现有的标准模块或第三方模块实现这一目标?我没有运气就进行了重要的搜索。
提前感谢任何建议。
答案 0 :(得分:0)
我不知道您可以使用现有标准或第三方模块获得数据结构的简单方法。
就像一个想法 - 因为没有其他回复 - 你可以尝试类似下面的内容,但是要更仔细地遍历嵌套词典:
for i in range(len(json_parsed)):
for k,v in json_parsed[i].items():
print(k, str(type(v)).replace("<class", "").replace('>',""))
id 'int'
username 'str'
website 'str'
address 'dict'
email 'str'
phone 'str'
company 'dict'
name 'str'
id 'int'
username 'str'
website 'str'
address 'dict'
email 'str'
phone 'str'
company 'dict'
name 'str'
答案 1 :(得分:0)
这是部分解决方案。它翻阅了一本 Python 字典,就是你这样做时得到的那种:
data = requests.get(...)
results = data.json()
我仍在研究它,即深入检查列表的复杂元素是否相同,以便我可以返回 first...
而不是 first, second
。
代码如下:
def schema(d, spacer=' ', indent=0, force=0):
types = [list, set, dict, tuple]
open_symbols = ['[', '{', '{', '(']
close_symbols = [']', '}', '}', ')']
res = ''
typ = type(d)
if typ in types:
os, cs = list(zip(open_symbols, close_symbols))[types.index(typ)]
res += f'{spacer * (indent*force)}{os}\n'
if isinstance(d, dict):
for key, value in d.items():
res += f'{spacer * (indent+1)}{key}: '
res += f'{schema(value, spacer, indent+1)}\n'
else:
if(typ is set):
return res[:-1] + (d.pop().__class__.__name__ if len(d) else None) + cs
else:
if all(isinstance(x, type(d[0])) for x in d[1:]) and type(d[0]) not in types:
return res[:-1] + d[0].__class__.__name__ + cs
else:
for value in d:
res += f'{schema(value, spacer, indent+1, 1)}\n'
res += f'{spacer * indent}{cs}'
else:
res = d.__class__.__name__
return res
一目了然:
pprint
版本派生出来的,所以你有间距元素;我不喜欢 pprint
的输出;set
和 tuple
的原因;未考虑到许多其他结构化类型;str
,因此您可以像这样使用它:print(schema(d))
,其中 d
是某个 Python 变量;return
;这些年来,我希望这会有所帮助。