簡體   English   中英

從深層嵌套的JSON結構中提取值

[英]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:通過一次訪問獲取每個值,如果沒有可預測的鍵,則意味着結構不存在(您可能已經注意到,字典可能具有不同的結構,具體取決於它是否成功操作,錯誤發生等)。

騙局:如何處理清單?

  • 使用一些遞歸函數來執行連續的鍵查找,例如“foo_rbody”,然后是“query”,“info”等。

有更好的候選人?

您可以嘗試使用這個相當簡單的函數來訪問嵌套屬性:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM