¿Cómo construir dinámicamente un objeto JSON con Python?


Soy nuevo en Python y estoy jugando con datos JSON. Me gustaría construir dinámicamente un objeto JSON agregando algún valor clave a un objeto JSON existente.

Probé lo siguiente pero obtengo TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data
 157
Author: Martijn Pieters, 2014-04-16

5 answers

Construyes el objeto antes de codificándolo en una cadena JSON:

import json

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

JSON es un formato de serialización , datos textualesque representan una estructura. No es, en sí misma, esa estructura.

 331
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-09 02:14:40

Ya hay una solución provista que permite construir un diccionario, (o diccionario anidado para datos más complejos), pero si desea construir un objeto, entonces tal vez intente 'ObjDict'. Esto le da mucho más control sobre el json a crear, por ejemplo conservando el orden, y permite construir como un objeto que puede ser una representación preferida de su concepto.

Pip instala objict primero.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
 14
Author: innov8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-02 01:51:31

Puedes crear el diccionario Python y serializarlo a JSON en una línea y ni siquiera es feo.

my_json_string = json.dumps({'key1': val1, 'key2': val2})
 10
Author: sscarduzio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-01 14:27:22

Puede usar EasyDict (doc):

EasyDict permite acceder a valores dict como atributos (funciona recursivamente). Notación de puntos de propiedades similares a Javascript para los dictados de Python.

USO

>>> 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

 5
Author: Benyamin Jafari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-12 22:04:16

Todas las respuestas anteriores son correctas, aquí hay una forma más y fácil de hacerlo. Por ejemplo, cree una estructura de datos Dict para serializar y deserializar un objeto

(Notice None es Null en python y estoy usando esto intencionalmente para demostrar cómo puede almacenar null y convertirlo en json null)

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

introduzca la descripción de la imagen aquí

 0
Author: CPU 100,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 16:54:27