Заменить значение в файле JSON для ключа, который может быть вложен в n уровней

У меня JSON, который выглядит так:

{ "ROLE_NAME": { "FOO": { "download_url": "http: //something.staging/12345/buzz.zip" }, "BAR": { "download_url": "http: //something.staging/12345/fizz.zip" }, "download_url": "http: //something.staging/12345/fizzbuzz.zip", "db_name": "somedb", "db_server": "dbserver.staging.dmz", "plugin": { "server_url": "http: //lab.staging.corp/server/" } } } 

Я написал немного питона, который заменяет «download_url» k: v новым значением (т. Е. Новым download_url). К сожалению, он заменяет только один из трех download_urls в этом фрагменте json. Я понимаю, почему, но мне трудно получить решение, и поэтому я здесь прошу о помощи.

Весь объект json – это «данные». Итак, я делаю что-то вроде этого:

 data["ROLE_NAME"]["download_url"] = download_url 

Где download_url – новое значение, которое я присвоил этой переменной. Мне нужно сделать это для любого ключа с именем ["download_url"], а затем обновить его, а не тот, который я указал на том слое, который я собираюсь сделать.

Некоторые из моих кодов, которые помогут:

Я беру некоторые значения, полученные ранее в моем коде, и строю URL, который возвращает ответ. Я извлекаю значение из ответа, которое будет использоваться для создания значения download_url

 buildinfo_url = "http://something.staging/guestAuth/app/rest/builds/?locator=buildType:%s,tags:%s,branch:branched:any" % (bt_number, list_json_load[role_name][0]['tag']) 

Отправить запрос HTTP

 client = httplib2.Http() response, xml = client.request(buildinfo_url) 

Извлеките некоторое значение из ответа xml и установите переменную download_url

 doc = ElementTree.fromstring(xml) for id in doc.findall('build'): build_id = "%s" % (id.attrib['id']) try: download_url = "http://something.staging/guestAuth/repository/download/%s/%s:id/%s" % (bt_number, build_id, build_artifact_zip) data[role_name]["download_url"] = download_url except NameError: print "something" 

Я думаю, что мне нужно рекурсивно искать и обновлять

One Solution collect form web for “Заменить значение в файле JSON для ключа, который может быть вложен в n уровней”

Использование рекурсии

 import json json_txt = """ { "ROLE_NAME": { "FOO": { "download_url": "http: //something.staging/12345/buzz.zip" }, "BAR": { "download_url": "http: //something.staging/12345/fizz.zip" }, "download_url": "http: //something.staging/12345/fizzbuzz.zip", "db_name": "somedb", "db_server": "dbserver.staging.dmz", "plugin": { "server_url": "http: //lab.staging.corp/server/" } } } """ data = json.loads(json_txt) def fixup(adict, k, v): for key in adict.keys(): if key == k: adict[key] = v elif type(adict[key]) is dict: fixup(adict[key], k, v) import pprint pprint.pprint( data ) fixup(data, 'download_url', 'XXX') pprint.pprint( data ) 

Вывод:

 {u'ROLE_NAME': {u'BAR': {u'download_url': u'http: //something.staging/12345/fizz.zip'}, u'FOO': {u'download_url': u'http: //something.staging/12345/buzz.zip'}, u'db_name': u'somedb', u'db_server': u'dbserver.staging.dmz', u'download_url': u'http: //something.staging/12345/fizzbuzz.zip', u'plugin': {u'server_url': u'http: //lab.staging.corp/server/'}}} {u'ROLE_NAME': {u'BAR': {u'download_url': 'XXX'}, u'FOO': {u'download_url': 'XXX'}, u'db_name': u'somedb', u'db_server': u'dbserver.staging.dmz', u'download_url': 'XXX', u'plugin': {u'server_url': u'http: //lab.staging.corp/server/'}}} 
  • Как преобразовать строковые данные в объект JSON в python?
  • Как создать sqlalchemy для json
  • Декодирование json и Iterate через элементы в шаблоне django
  • json query, который возвращает родительский элемент и дочерние данные?
  • Запросы POST на сайт ASP не приносят хорошего результата
  • Преобразование JSON в CSV с использованием Python (Idle)
  • Почему json.dumps сбрасывает символы не-ascii с помощью "\ uxxxx"
  • подключение python к javascript для двухсторонней связи
  •  
    Interesting Posts for Van-Lav

    ftps.storlines socket.timeout, несмотря на завершение загрузки файлов

    Ошибка при использовании `struct.pack` для записи данных в файл

    Объект ISO to datetime: 'z' является плохой директивой

    Есть ли причина, по которой Ctypes.CDLL Python не может автоматически генерировать restype и argtypes из файлов заголовков C?

    Создание частичных подмножеств в Python

    Базовая многопроцессорная обработка с циклом while

    Как вы показываете путь к текущему запущенному модулю python?

    Python 2.7 на Windows, «assert main_name не в sys.modules, main_name» для всех примеров многопроцессорности

    Различное поведение одного и того же регулярного выражения в Python и Java

    Преобразование матрицы R в Pandas Dataframe

    Ящик запроса API Dropbox не работает с Python 3?

    Python скрывает тики, но показывает метки ярлыков

    Как перечислить все исключения, которые функция могла бы повысить в Python 3?

    Каков наилучший способ аутентификации, идентификации и хранения деликатной информации о пользователях?

    Могу ли я получить доступ к определенным ключевым значениям в словаре из шаблона django?

    Python - лучший язык программирования в мире.