在python中,将未知长度的路径(URL)应用于JSON对象



给定长度未知的路径()和相关值():

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

但是我不知道每条路径的深度…?!

要获得递归字典,可以使用这个帮助类

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="/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}

最新更新