2016-08-22 26 views
0

我有一个JSON文件,该文件是这样的:更新的嵌套JSON文件了深刻的关键

{ 
    "email": "[email protected]", 
    "firstName": "name01", 
    "surname": "Optional" 
    "layer01": { 
     "key1": "value1", 
     "key2": "value2", 
     "key3": "value3", 
     "key4": "value4", 
     "layer02": { 
      "key1": "value1", 
      "key2": "value2" 
     }, 
     "layer03": [ 
      { 
       "inner_key01": "inner value01" 
      }, 
      { 
       "inner_key02": "inner_value02" 
      } 
     ] 
    }, 
    "surname": "Required only$uid" 
} 

我期待更新请求为:

{ 
       "email": "[email protected]", 
       "firstName": "firstName", 
       "layer01.key3": "newvalue03", 
       "layer01.layer02.key1": "newvalue01" 
      }, 

更深键使用"."分离

am使用python2.7。任何人都可以告诉我这个..我真的坚持在这!

这就是我正在同:

def updateTemplate(self,templatename, data): 
    template= self.getTemplatedata(templatename) # gets the python object with the data from original file 

    for ref in data: 
     k= ref 
     keys= ref.split(".") 
     temp= template 
     if len(keys)>1: 
      temp= template[keys[0]] 
      for i in range(1,lens(keys)-1): 
       print keys[i] 
       if type(temp) is dict: 
        temp =temp[keys[i]] 



      temp[keys[len(keys)-1]]= data[k] 
      print temp 

      template.update(temp)   
     else: 
      template[k]= data[k] 
    print template 

更新添加模板对象中一个全新的关键。我需要更新的最后温度到模板对象的关键

模板对象显示此:

{ u'email': u'[email protected]', 
    u'firstName': u'Valid AU$uid', 
    u'key1': u'value1', 
    u'key2': u'value2', 
    u'key3': u'value03', 
    u'key4': u'value4', 
    u'layer01': { u'key1': u'value1', 
        u'key2': u'value2', 
        u'key3': u'value03', 
        u'key4': u'value4', 
        u'layer02': { u'key1': u'value01', u'key2': u'value2'}, 
        u'layer03': [ { u'inner_key01': u'inner value01'}, 
            { u'inner_key02': u'inner_value02'}]}, 
    u'layer02': { u'key1': u'value01', u'key2': u'value2'}, 
    u'layer03': [ { u'inner_key01': u'inner value01'}, 
        { u'inner_key02': u'inner_value02'}], 
    u'surname': u'Required only$uid'} 
+0

请显示您的尝试。 – Julien

+0

我编辑了这个问题,并在末尾添加了我的代码,..请看看它 – Vineeth

+0

它似乎适用于我。什么不适合你?你说“更新在模板对象中添加了一个全新的密钥”,但这对Python字典是不可能的:密钥是唯一的。 –

回答

0

您的算法非常接近,但其中有一些事情会使事情不必要地复杂化。这使得它很容易错过这是造成问题的关键线路:

template.update(temp) 

temp是儿童最字典的模板但在这里你设置的原始模板把所有它的孩子了。注释此行,它应该工作。

一些我清理,使该行更容易的事发现:

  • 不要硬编码的情况下那里只有一个keys列表元素。循环可以处理它。
  • 在Python中,有一个很好的速记keys[len(keys)-1]keys[-1]。见Negative index to Python list
  • 而不是使用枚举和检查,如果临时的类型是字典的,根本就没有循环在过去的密钥(这可能改变行为有点其他输入)
  • 使用pprint。它漂亮地打印列表和字典等东西。

放在一起,一个简化版本是这样的:

import pprint 

def updateTemplate(self, templatename, data): 
    template = self.getTemplatedata(templatename) # gets the python object with the data from original file 

    for ref in data: 
     keys = ref.split(".") 
     temp = template 
     for key_part in keys[:-1]: 
      temp = temp[key_part] 
     temp[keys[-1]] = data[ref] # Because dictionaries are mutable, this updates template too 

    pprint.pprint(template) 

希望这有助于。

+0

感谢您的解决方案。我能用Pydash解决这个问题。这非常简单。 – Vineeth

0

虽然我想帮你出多少,我觉得你的代码混淆,但我我会尽我所能。这里就是

对于初学者,通过temp= template做你的意思是做temp= copy.deepcopy(template)?记住import copyReference

我得到的模板是一本字典,但你想通过引用templatetemp实现,调整temp然后加入

template.update(temp)

temp什么template其实temp是参考template

我们如何取消代码并开始新鲜。

即输入是

{ 
    "email": "[email protected]", 
    "firstName": "firstName", 
    "layer01.key3": "newvalue03", 
    "layer01.layer02.key1": "newvalue01" 
} 

现有的数据是:

{ 
    "email": "[email protected]", 
    "firstName": "name01", 
    "surname": "Optional" 
    "layer01": { 
     "key1": "value1", 
     "key2": "value2", 
     "key3": "value3", 
     "key4": "value4", 
     "layer02": { 
      "key1": "value1", 
      "key2": "value2" 
     }, 
     "layer03": [ 
      { 
       "inner_key01": "inner value01" 
      }, 
      { 
       "inner_key02": "inner_value02" 
      } 
     ] 
    }, 
    "surname": "Required only$uid" 
} 

预期输出:

{ 
    "email": "[email protected]", 
    "firstName": "firstName", 
    "surname": "Optional" 
    "layer01": { 
     "key1": "value1", 
     "key2": "value2", 
     "key3": "newvalue03", 
     "key4": "value4", 
     "layer02": { 
      "key1": "newvalue01", 
      "key2": "value2" 
     }, 
     "layer03": [ 
      { 
       "inner_key01": "inner value01" 
      }, 
      { 
       "inner_key02": "inner_value02" 
      } 
     ] 
    }, 
    "surname": "Required only$uid" 
} 

请确认这是否是你期待的结果,所以我可以帮你与你的头脑风暴。

+0

这正是我所期待的。 – Vineeth

+0

正在做一些关于使用python进行字典工作的研发。遇到'pydash'。它实际上解决了我的问题。有了它,我可以通过“。”直接访问深层节点。例如:layer01.layer02.key ...... – Vineeth