Как поменять данные в JSON из Python?

Есть некий валидный JSON-файлик. Пример:

{
    "example": ["test1", "test2"]
    
}

Как можно поменять значение конкретного элемента/ключа (напр., test1) на Python. Или реализовать полное чтение, изменение в дампе и перезапись


Ответы (3 шт):

Автор решения: Алексей Белкин

"example" - это ключ словаря.

["test1", "test2"] - это обычный список, доступ к которому идет по ключу словаря. Доступ к каждому элементу списка - масса, например, по индексу(самый примитивный):

dict_name["example"][0] = new_data
→ Ссылка
Автор решения: Никита

Используйте модуль json, который идет "из коробки":

import json

JSON = '''
{
    "example": ["test1", "test2"]
    
}
'''

print(json.loads(JSON)["example"][0]) 
# Тут мы читаем json и получаем значение ключа "example", 
# потом берем элемент 0 и выводим его через print() в консоль.
→ Ссылка
Автор решения: Dmitry

Согласен с @Никита, что для корректной работы и сохранения всех правил JSON'a вам необходимо пользоваться стандартым модулем json.

Когда вы получаете JSON, то для Python это всегда строки или последовательность бит. И этот тип данных вы можете конвертировать в словарь Python, при помощи

dict_from_json = json.loads(JSON)

После этого переменная dict_from_json будет содержать понятный для Python словарь (тип данных dict). То есть вот на этом этапе у вас появляется возможность обращаться к словарю по ключам и изменять значения в нем.

После того как вы сделали изменения и вы хотите сохранить структуру JSON, то вам необходимо воспользоваться обратной операцией и сделать следующее

updated_json = json.dumps(dict_from_json)

После этой операции updated_json будет содержать строку, как JSON.

Все это нужно для того, чтобы не нарушать структуры и следовать типам данных, которые различаются в Python и JSON. Различия вот здесь можно глянуть.

И если все собрать вместе, то мы получим

import json
JSON = '''
{
    "example": ["test1", "test2"]
    
}
'''
dict_from_json = json.loads(JSON) # dict
dict_from_json.get("example")[0] = True # меняю значение
print(f"Словарь такой: {dict_from_json}")
json_from_dict = json.dumps(dict_from_json)
print(f"А вот JSON такой:{json_from_dict}")

Вывод

Словарь такой: {'example': [True, 'test2']}
А вот JSON такой:{"example": [true, "test2"]}

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

→ Ссылка