2016-08-23 7 views
0

考えるとパス(FOOS)未知の長さの、および関連する値(バー):私は再帰的にマッピングすることができますどのように、JSONオブジェクトに未知の長さのパス(URL)を適用

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

これらはjson構造に、例えばpythonのjsonモジュールを使用していますか?

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

しかし、私は提供される各パスの深さを知らない...:

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

前述のJSONモジュールがサポートされています。上記になるのでしょうか?!

+1

これは学校の割り当てのように思えます。これまでに試したことを分かち合うことができますか? –

+0

私はそれが好きだと思うが、それは私が問題を提示したやり方だと思う。現実は、私はこの挑戦をカバーするSOに関する質問を見ることができなかったので、追加する価値があると考えられました。 – 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 that better? – muddyfish

+0

私はそれを試してみましょう:) – GMeister

関連する問題