将键值对的Tree转换为json对象

时间:2019-01-03 23:46:34

标签: python dictionary

我正在使用一种API,该API以一种奇怪的“树状”数据结构格式返回数据,我试图将其转换为适当的JSON对象以实现可重用性。

它有点像“树”结构,我很幸运只转换了“键”,但是在将值与之关联时遇到了麻烦。以下答案https://stackoverflow.com/a/9619101/1899406似乎是一个很好的起点。

代码:

dct = {}
for key in config.keys():
    p = dct
    for x in key.split('/'):
        p = p.setdefault(x, {})

开始数据:

{   u'key': 
    u'/parent/child/child2/keyname1',
    u'value': u'arbitrary value'},
{   u'key': u'/parent/child/keyname2',
    u'value': u'arbitrary value2'},
{   u'key': 
    u'/parent/child/child2/child3/child4/child5/keyname3',
    u'value': u'arbitrary value3'},
{   u'key': u'/parent/keyname4',
    u'value': u'arbitrary value4'},

...

轻微清理:

{{   u'/parent/child/child2/keyname1':
    u'arbitrary value'},
{   u'/parent/child/keyname2':
    u'arbitrary value2'},
{   u'/parent/child/child2/child3/child4/child5/keyname3':
    u'arbitrary value3'},
{   u'/parent/keyname4':
    u'arbitrary value4'}}

所需格式(大致):

{
    u'parent': {
        u'keyname4': u'arbitrary value4',
        u'child': {
            u'keyname2': u'arbitrary value2',
            u'child2': {
                u'keyname1': u'arbitrary value',
                u'child3': {
                    u'child4': {
                        u'child5': {
                            u'keyname4': u'arbitrary value4'
                                   }
                               }
                           }
                       }
                  }
               }
}

1 个答案:

答案 0 :(得分:1)

似乎您需要拆分/上的键值,然后使用每个键值构建一个对象。 dict.setdefault()在这里非常方便,因为它使您可以在键处获取一个值或将其设置为默认值,并在尚未定义键的情况下获取该值。

这会在setdefault()中使用reduce(您也可以使用for循环并只跟踪当前字典)来向下遍历到倒数第二个键。然后使用最后一个键设置值:

from functools import reduce

d = {}
for item in tree:
    for k, v in item.items():
        path = k.split('/')
        parent = reduce(lambda curr, x: curr.setdefault(x, {}), path[1:-1], d)
        parent[path[-1]] = v

d的结尾应如下所示:

{'parent': {
    'child': {
         'child2': {'keyname1': 'arbitrary value',
                    'child3': {
                         'child4': {
                             'child5': {'keyname3': 'arbitrary value3'}
                          }
                     }
           },
          'keyname2': 'arbitrary value2'},
          'keyname4': 'arbitrary value4'}
  } # i *think* I got the indents right!