这是我从其他地方获得的结构,即深层嵌套词典列表:
{
"foo_code": 404,
"foo_rbody": {
"query": {
"info": {
"acme_no": "444444",
"road_runner": "123"
},
"error": "no_lunch",
"message": "runner problem."
}
},
"acme_no": "444444",
"road_runner": "123",
"xyzzy_code": 200,
"xyzzy_rbody": {
"api": {
"items": [
{
"desc": "OK",
"id": 198,
"acme_no": "789",
"road_runner": "123",
"params": {
"bicycle": "2wheel",
"willie": "hungry",
"height": "1",
"coyote_id": "1511111"
},
"activity": "TRAP",
"state": "active",
"status": 200,
"type": "chase"
}
]
}
}
}
{
"foo_code": 200,
"foo_rbody": {
"query": {
"result": {
"acme_no": "260060730303258",
"road_runner": "123",
"abyss": "26843545600"
}
}
},
"acme_no": "260060730303258",
"road_runner": "123",
"xyzzy_code": 200,
"xyzzy_rbody": {
"api": {
"items": [
{
"desc": "OK",
"id": 198,
"acme_no": "789",
"road_runner": "123",
"params": {
"bicycle": "2wheel",
"willie": "hungry",
"height": "1",
"coyote_id": "1511111"
},
"activity": "TRAP",
"state": "active",
"status": 200,
"type": "chase"
}
]
}
}
}
要求不同的结构是不可能的(传统的apis等)。
所以我想知道是否有一些聪明的方法从这样的结构中提取选定的值。
我想到的候选人:
压扁特定词典,构建复合键,如:
{ “foo_rbody.query.info.acme_no”:“444444”, “foo_rbody.query.info.road_runner”:“123”, ... }
Pro:通过一次访问获取每个值,如果没有可预测的键,则表示结构不存在(您可能已经注意到,字典可能具有不同的结构,具体取决于它是否成功运行,错误发生,等)。
骗局:如何处理清单?
有更好的候选人吗?
答案 0 :(得分:6)
您可以尝试使用这个相当简单的函数来访问嵌套属性:
import re
def get_path(dct, path):
for i, p in re.findall(r'(\d+)|(\w+)', path):
dct = dct[p or int(i)]
return dct
用法:
value = get_path(data, "xyzzy_rbody.api.items[0].params.bicycle")
答案 1 :(得分:2)
在我对this post的回答中,函数byPath
可能会对您有所帮助。
答案 2 :(得分:1)
您可以创建自己的路径机制,然后使用路径查询复杂的dict。例如:
/
:获取根对象/key
:获取root_object['key']
的值,例如/foo_code
- > 404
/key/key
:嵌套:/foo_rbody/query/info/acme_no
- > 444444
/key[i]
:获取该列表的ith
元素,例如/xyzzy_rbody/api/items[0]/desc
- > "OK"
该路径还可以返回一个字典,然后您可以运行更多查询等。
递归实现相当容易。
答案 3 :(得分:1)
我想到另外两个解决方案:
您可以尝试Pynq包,此处描述 - structured query language for JSON (in Python)。据我所知,它是某种用于python的LINQ。
您也可以尝试将JSON转换为XML,然后使用Xquery语言从中获取数据 - XQuery library under Python