2016-08-23 53 views
0

鑑於路徑(FOOS)未知長度的,和相關的值():在Python中,適用於一個JSON對象未知長度的路徑(URL)

foo1 = '/path/key1' 
foo2 = '/path/node1/key2' 
bar1 = 'value1' 
bar2 = 'value2' 

如何可以遞歸映射這些到一個JSON結構,例如使用Python的JSON模塊?上述將成爲:

{ 'path': 
    { 'key1': 'value1', 
    'node1': { 'key2': 'value2' } 
    } 
} 

上述JSON模塊支持:

json_data['path']['key1'] = bar1 
json_data['path']['node1']['key2'] = bar2 

但我不知道提供的每個路徑的深度...?!

+1

這似乎是一所學校分配。你可以分享你迄今爲止嘗試過的嗎? –

+0

似乎喜歡它,但我認爲這就是我提出問題的方式,我幾乎刪除了所有的上下文。實際情況是,我看不到任何有關這個挑戰的問題,因此認爲值得補充。 – GMeister

+0

你所要做的就是使用遞歸/實現一個自定義類 – muddyfish

回答

2

爲了得到一個遞歸的字典,你可以使用這個輔助類

class RecursiveDict(dict): 
    def __missing__(self, attr): 
     db = RecursiveDict() 
     super(RecursiveDict, self).__setitem__(attr, db) 
     return db 

    def __setitem__(self, attr, value): 
     if isinstance(attr, (tuple,list)): 
      cur = self[attr[0]] 
      for i in attr[1:-1]: 
       cur = cur[i] 
      cur[attr[-1]] = value 
     else: 
      super(RecursiveDict, self).__setitem__(attr, value) 

    def __getitem__(self, item): 
     if isinstance(item, (tuple, list)): 
      cur = self[item[0]] 
      for i in item[1:]: 
       cur = cur[i] 
      return cur 
     else: 
      return super(RecursiveDict, self).__getitem__(item) 

    def __delitem__(self, item): 
     if isinstance(item, (tuple, list)): 
      cur = self[item[0]] 
      for i in item[1:-1]: 
       cur = cur[i] 
      del cur[item[-1]] 
     else: 
      return super(RecursiveDict, self).__delitem__(item) 

使用像:

a=RecursiveDict() 

path="https://stackoverflow.com/a/a/a" 
path = path.strip("/").split("/") 

a[path]="value" 
a["a","b","c"]=1 
a["b"]=2 
print a 

- >{'a': {'a': {'a': 'value'}, 'b': {'c': 1}}, 'b': 2}

+0

你能看到我最新的評論嗎?這是你的「使用」中的最後一行,就是挑戰....如果你不知道路徑是a-c還是a-z,那該怎麼做? – GMeister

+0

@GMeister那個更好? – muddyfish

+0

讓我試試:) – GMeister