Элегантный способ установить значения во вложенном JSON в Python - PullRequest
0 голосов
/ 06 февраля 2019

Я устанавливаю некоторые значения во вложенном JSON.В JSON необязательно, чтобы ключи всегда присутствовали.
Мой пример кода выглядит следующим образом.

if 'key' not in data:
    data['key'] = {}
if 'nested_key' not in data['key']:
    data['key']['nested_key'] = some_value

Есть ли другой элегантный способ добиться этого?Простое присвоение значения без if's like - data['key']['nested_key'] = some_value может иногда выдавать KeyError.

. Я задал несколько похожих вопросов о «получении вложенного JSON» в StackOverflow, но ни один из них не выполнил моего требования.Поэтому я добавил новый вопрос.В случае, если это дублирующий вопрос, тогда я удалю этот, направленный на правильный вопрос.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете написать в одном утверждении:

data.setdefault('key', {})['nested_value'] = some_value

, но я не уверен, что это выглядит более элегантно.

PS: если вы предпочитаете использовать defaultdict, предложенный Джеем, вы можетеинициализируйте новый dict исходным, возвращаемым json.loads(), а затем передайте его json.dumps():

data2 = defaultdict(dict, data)
data2['key'] = value
json.dumps(data2)    # print the expected dict
0 голосов
/ 06 февраля 2019

Обратите внимание, что для вставки вам не нужно проверять ключ, и вы можете напрямую добавить его.Но defaultdict может быть использован.Это особенно полезно в случае таких значений, как списки.

from collections import defaultdict

data = defaultdict(dict)
data['key']['nested_key'] = some_value

defaultdict гарантирует, что вы никогда не получите ошибку ключа.Если ключ не существует, он возвращает пустой объект того типа, с которым вы его инициализировали.

Пример на основе списка:

from collections import defaultdict

data = defaultdict(list)
data['key'].append(1)

, что в противном случае должно быть выполнено следующим образом:ниже:

data = {}
if 'key' not in data:
    data['key'] = ['1']
else:
    data['key'].append('2')

Пример на основе существующего dict:

from collections import defaultdict

data = {'key1': 'sample'}    
data_new = defaultdict(dict,data)    
data_new['key']['something'] = 'nothing'

print data_new

Вывод:

defaultdict(<type 'dict'>, {'key1': 'sample', 'key': {'something': 'nothing'}})
...