Як динамічно будувати об’єкт 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

Відповіді:


553

Ви будуєте об'єкт перед кодуванням його до рядка JSON:

import json

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

JSON - це формат серіалізації , текстові дані, що представляють структуру. Це не сама структура.


2
Ваше рішення спрацювало як шарм для мене. Я не міг зрозуміти значення вашого останнього рядка, чи не могли б ви трохи розібратися в цьому. Дякую.
аккі

6
@akki: ОП намагалася трактувати рядок JSON (серію символів, що кодують об'єкт) як сам об'єкт. Вони намагалися використовувати json_data['key'] = 'value', що не спрацює, оскільки json_dataце не словник Python.
Martijn Pieters

Даний об'єкт може перетворити об'єкт у JSON чи словник якось автоматично?
Чарлі Паркер

@CharlieParker: це занадто широко. Об'єкти Python не так просто відображаються в JSON, оскільки JSON є досить обмеженим форматом із лише кількома типами даних. Тут уже багато питань, які стосуються конкретних типів об'єктів та JSON, таких як моделі Django або SQLAlchemy тощо.
Martijn Pieters

1
@AlexJohnson: pip listнадає вам таку ж інформацію та може вивести JSON:pip list --format=json
Martijn Pieters

24

Ви можете створити словник Python і серіалізувати його в JSON в одному рядку, і це навіть не потворно.

my_json_string = json.dumps({'key1': val1, 'key2': val2})

21

Вже є рішення, яке дозволяє створити словник (або вкладений словник для більш складних даних), але якщо ви хочете створити об'єкт, то, можливо, спробуйте "ObjDict". Це дає значно більший контроль над створенням json, наприклад, збереження порядку, і дозволяє будувати як об'єкт, який може бути кращим представленням вашої концепції.

pip встановити objdict спочатку.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()

2
це саме те, що я шукав! Зважаючи на те, що дикти є не упорядкованими, хоча ви можете сортувати за алфавітом, коли дзвоніть, json.dumpsтобто json.dumps(response, sort_keys=True, indent=4), але ви застрягли в алфавітному порядку, а не вподобаному впорядкуванні, групуванні та представленні
Джонатан

11

Ви можете використовувати EasyDictбібліотеку ( doc ) :

EasyDict дозволяє отримати доступ до значень dict як атрибутів (працює рекурсивно). Позначення крапок властивостей Javascript для піктонів python.

ВИКОРИСТАННЯ

>>> 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 для серіалізації та десеріалізації об'єкта

( Зауважте, що None - це Null в python, і я навмисно використовую це, щоб продемонструвати, як ви можете зберігати 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)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.