Как динамически построить объект JSON с Python?

274

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

Я попробовал следующее, но я получаю TypeError: 'str' object does not support item assignment:

import json

json_data = json.dumps({})
json_data["key"] = "value"

print 'JSON: ', json_data
Backo
источник

Ответы:

554

Вы строите объект перед его кодированием в строку JSON:

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

JSON - это формат сериализации , текстовые данные, представляющие структуру. Это не сама структура.

Мартейн Питерс
источник
2
Ваше решение сработало как очарование для меня. Я не мог понять смысл вашей последней строки, не могли бы вы, пожалуйста, уточнить это немного. Спасибо.
akki
6
@akki: OP попытался обработать строку JSON (последовательность символов, кодирующих объект) как сам объект. Они пытались использовать json_data['key'] = 'value', что не сработает, потому что json_dataэто не словарь Python.
Мартин Питерс
данный объект может преобразовать объект в JSON или словарь как-то автоматически?
Чарли Паркер
@CharlieParker: это слишком широко. Объекты Python не просто отражаются в JSON, поскольку JSON - это довольно ограниченный формат с несколькими типами данных. Здесь уже много вопросов по SO, которые охватывают конкретные типы объектов и JSON, такие как модели Django или SQLAlchemy и т. Д.
Martijn Pieters
1
@AlexJohnson: pip listдает вам ту же информацию и может выводить JSON:pip list --format=json
Мартин Питерс
25

Вы можете создать словарь Python и сериализовать его в JSON в одну строку, и это даже не страшно.

my_json_string = json.dumps({'key1': val1, 'key2': val2})
sscarduzio
источник
21

Уже есть решение, которое позволяет создать словарь (или вложенный словарь для более сложных данных), но если вы хотите построить объект, то, возможно, попробуйте ObjDict. Это дает гораздо больший контроль над создаваемым json, например, сохранение порядка, и позволяет строить как объект, который может быть предпочтительным представлением вашей концепции.

Сначала установите pip.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
innov8
источник
2
это именно то, что я искал! Учитывая, что диктовки неупорядочены, хотя вы можете сортировать по алфавиту при вызове json.dumpsie json.dumps(response, sort_keys=True, indent=4), но тогда вы застряли в алфавитном порядке, а не по своему предпочтительному порядку, группировке и представлению
Джонатан
11

Вы можете использовать EasyDictбиблиотеку ( doc ) :

EasyDict позволяет получить доступ к значениям dict как атрибутам (работает рекурсивно). Javascript-подобные свойства обозначают точки для Python dicts.

Useage

>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

[ Установка ]:

  • pip install easydict
Беньямин Джафари
источник
Беньямин, не могли бы вы отредактировать свой пример, чтобы показать использование с дампами и загрузками JSON?
Том Айвс
7

Все предыдущие ответы верны, вот еще один и простой способ сделать это. Например, создайте структуру данных Dict для сериализации и десериализации объекта

( Обратите внимание, что в Python None - это NULL, и я намеренно использую это, чтобы продемонстрировать, как вы можете сохранить NULL и преобразовать его в JSON NULL)

import json
print('serialization')
myDictObj = { "name":"John", "age":30, "car":None }
##convert object to json
serialized= json.dumps(myDictObj, sort_keys=True, indent=3)
print(serialized)
## now we are gonna convert json to object
deserialization=json.loads(serialized)
print(deserialization)

введите описание изображения здесь

grepit
источник