2013-08-06 172 views
1

該提取值是一個結構,我從其他地方獲得,也就是說,深度嵌套的詞典列表:從深度嵌套的JSON結構

{ 
    "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" 
       } 
      ] 
     } 
    } 
} 

問計不同的結構是毫無疑問的(傳統的API等)。

所以我想知道是否有一些聰明的方式從這樣的結構中提取選定的值。

我在想的候選人:

  • 壓扁特別詞典,構建複合鍵,水木清華這樣的:

    { 「foo_rbody.query.info.acme_no」: 「444444」, 「foo_rbody.query.info.road_runner」: 「123」, ... }

臨:讓每個具有一個訪問權限的值,如果可預測的關鍵字不存在,則意味着該結構不在那裏(正如您可能已經注意到的,根據字典是否成功操作,發生錯誤等,字典可能具有不同的結構)。

Con:如何處理列表?

  • 使用一些遞歸函數,將做連續的鍵查找,通過「foo_rbody」說,然後通過「查詢」,「信息」等

任何更好的人選?

回答

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") 
+0

簡單,非遞歸,緊密。爲什麼我不考慮這樣的弊端?好吧。 – LetMeSOThat4U

+0

偉大的解決方案。性能如何? – advance512

1

您可以創建自己的路徑機制,然後用路徑查詢複雜的字典。例如:

  • /:獲取根對象
  • /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"

的路徑也可以返回一個字典,你再上運行多個查詢等

這將是非常容易實現遞歸。