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

274

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

Intenté lo siguiente pero me sale TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data
Backo
fuente

Respuestas:

554

Construye el objeto antes de codificarlo en una cadena JSON:

import json

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

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

Martijn Pieters
fuente
2
Tu solución funcionó como un encanto para mí. Sin embargo, no pude entender el significado de tu última línea, ¿podrías explicarlo un poco? Gracias.
akki
66
@akki: el OP intentó tratar la cadena JSON (una serie de caracteres que codifican un objeto) como el objeto mismo. Intentaron usar json_data['key'] = 'value', lo que no funcionará porque json_datano es un diccionario de Python.
Martijn Pieters
dado un objeto, ¿se puede transformar el objeto en JSON o en un diccionario de alguna manera automáticamente?
Charlie Parker
@CharlieParker: eso es demasiado amplio. Los objetos de Python no se reflejan simplemente en JSON, ya que JSON es un formato bastante limitado con solo unos pocos tipos de datos. Aquí hay muchas preguntas sobre SO que cubren tipos de objetos específicos y JSON, como los modelos Django o SQLAlchemy, etc.
Martijn Pieters
1
@ AlexJohnson: pip listle brinda la misma información y puede enviar JSON:pip list --format=json
Martijn Pieters
25

Puede 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})
sscarduzio
fuente
21

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

pip install objdict primero.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
innov8
fuente
2
¡Esto es exactamente lo que estaba buscando! Dado que los dictados no están ordenados, aunque puede ordenarlos por orden alfabético al llamar , json.dumpses decir json.dumps(response, sort_keys=True, indent=4), pero entonces está atascado con el orden alfabético y no con su orden, agrupación y representación preferidos
Jonathan
11

Puedes usar EasyDictlibrary ( doc ) :

EasyDict permite acceder a los valores dict como atributos (funciona de forma recursiva). Una notación de puntos de propiedades similares a Javascript para los dictos 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

[ Instalación ]:

  • pip install easydict
Benyamin Jafari
fuente
Benyamin, ¿podrías editar tu ejemplo para mostrar el uso con volcados y cargas JSON?
Thom Ives
7

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

( Observe que None es Null en python y lo estoy usando intencionalmente para demostrar cómo puede almacenar null y convertirlo a 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)

ingrese la descripción de la imagen aquí

grepit
fuente