2016-08-22 4 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" 
      }, 

глубокие ключи разделяются с помощью "."

Я использую 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) 

температура является дочерним-самым словарем шаблона, но здесь вы установили оригинальный шаблон, чтобы все это дети тоже. Прокомментируйте эту строку, и она должна работать.

Некоторые из вещей, которые я убирал, чтобы сделать эту линию легче найти:

  • Не жёстко случая, когда есть только один элемент в списке 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

Я понимаю, что шаблон является словарь, но то, что вы хотите достичь с помощью ссылки template к temp, настройки 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. Пришел через «пидаш». это фактически решило мою проблему. С его помощью я могу получить доступ к глубоким узлам прямо через "." например: layer01.layer02.key ...... – Vineeth

Смежные вопросы