[英]Extracting values from complex and deeply nested list of dictionaires using python?
[英]Extracting values from deeply nested JSON structures
這是我從其他地方獲得的結構,即深度嵌套字典的列表:
{
"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:通過一次訪問獲取每個值,如果沒有可預測的鍵,則意味着結構不存在(您可能已經注意到,字典可能具有不同的結構,具體取決於它是否成功操作,錯誤發生等)。
騙局:如何處理清單?
有更好的候選人?
您可以嘗試使用這個相當簡單的函數來訪問嵌套屬性:
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")
也許我在這篇文章的回答中的函數byPath
可能對你有所幫助。
您可以創建自己的路徑機制,然后使用路徑查詢復雜的dict。 例:
/
:獲取根對象 /key
:獲取root_object['key']
,例如/foo_code
- > 404
/key/key
: /foo_rbody/query/info/acme_no
: /foo_rbody/query/info/acme_no
- > 444444
/key[i]
:獲取該列表的ith
元素,例如/xyzzy_rbody/api/items[0]/desc
- > "OK"
該路徑還可以返回一個dict,然后您可以運行更多查詢等。
遞歸實現相當容易。
我想另外兩個解決方案:
您可以嘗試打包Pynq ,這里描述 - JSON的結構化查詢語言(在Python中) 。 據我所知,它是某種用於python的LINQ。
您也可以嘗試將JSON轉換為XML,然后使用Xquery語言從中獲取數據 - Python下的XQuery庫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.