【问题标题】:In python, apply path (URL) of unknown length to a JSON object在python中,将未知长度的路径(URL)应用于JSON对象
【发布时间】:2016-12-30 04:32:02
【问题描述】:

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

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

但我不知道所提供的每条路径的深度...?!

【问题讨论】:

  • 这似乎是一项学校作业。你能分享一下你到目前为止的尝试吗?
  • 似乎是这样,但我认为这就是我提出问题的方式,我已经删除了几乎所有的上下文。现实情况是,我在 SO 上看不到任何涵盖这一挑战的问题,因此认为值得添加。
  • 你所要做的就是使用递归/实现一个自定义类
  • @muddyfish 在构造赋值语句时如何递归表示“目录”列表?
  • 看str.split方法

标签: python json dictionary recursion


【解决方案1】:

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

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}

【讨论】:

  • 你能看到我的最新评论吗?这是您“使用”中的最后一行,这是挑战......当您不知道路径是 a-c 还是 a-z 时如何做到这一点??
  • @GMeister 更好吗?
  • 让我试试看:)
  • 我正在寻找的密钥在a["a","b","c"]=1 中得到了演示,它允许我递归地生成一个元组以应用于 RecursiveDict。谢谢!
  • 我的最后一条评论是有效的,但我刚刚意识到你的第一个用例正是我想要的,没有递归元组生成。简单!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2020-11-12
  • 2020-08-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多