Como criar dinamicamente um objeto JSON com Python?

274

Eu sou novo no Python e estou jogando com dados JSON. Gostaria de criar dinamicamente um objeto JSON adicionando algum valor-chave a um objeto JSON existente.

Eu tentei o seguinte, mas recebo TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data
Backo
fonte

Respostas:

554

Você constrói o objeto antes de codificá-lo em uma sequência JSON:

import json

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

JSON é um formato de serialização , dados textuais representando uma estrutura. Não é, por si só, essa estrutura.

Martijn Pieters
fonte
2
Sua solução funcionou como um encanto para mim. Eu não conseguia entender o significado da sua última linha, você poderia elaborar um pouco isso. Obrigado.
akki
6
@akki: o OP tentou tratar a string JSON (uma série de caracteres que codificam um objeto) como o próprio objeto. Eles tentaram usar json_data['key'] = 'value', o que não funcionará porque json_datanão é um dicionário Python.
Martijn Pieters
dado um objeto, pode-se transformar o objeto em JSON ou um dicionário de alguma forma automaticamente?
Charlie Parker
@CharlieParker: isso é muito amplo. Os objetos Python não são tão refletidos no JSON, pois o JSON é um formato bastante limitado, com apenas alguns tipos de dados. Já existem muitas perguntas aqui no SO que abrangem tipos de objetos específicos e JSON, como Django ou SQLAlchemy, etc.
Martijn Pieters
1
@AlexJohnson: pip listfornece as mesmas informações e pode gerar JSON:pip list --format=json
Martijn Pieters
25

Você pode criar o dicionário Python e serializá-lo para JSON em uma linha, e nem é feio.

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

Já existe uma solução fornecida que permite a construção de um dicionário (ou dicionário aninhado para dados mais complexos), mas se você deseja criar um objeto, talvez tente 'ObjDict'. Isso dá muito mais controle sobre o json a ser criado, por exemplo, reter a ordem e permite a construção como um objeto que pode ser uma representação preferida do seu conceito.

O pip instala o objeto primeiro.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
innov8
fonte
2
isto é exatamente o que eu estava procurando! Dado que dicts são não-ordenada, embora você poderia classificar por ordem alfabética ao chamar json.dumpsisto json.dumps(response, sort_keys=True, indent=4), mas então você está preso com ordem alfabética e não a sua ordem preferida, agrupamento e representação
Jonathan
11

Você pode usar a EasyDictbiblioteca ( doc ) :

O EasyDict permite acessar valores de ditado como atributos (funciona recursivamente). Uma notação de ponto de propriedades semelhante a Javascript para dict python.

UTILIZAÇÃO

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

[ Instalação ]:

  • pip install easydict
Benyamin Jafari
fonte
Benyamin, você poderia editar seu exemplo para mostrar o uso com despejos e cargas JSON?
Thom Ives
7

Todas as respostas anteriores estão corretas. Aqui está mais uma maneira fácil de fazer isso. Por exemplo, crie uma estrutura de dados Dict para serializar e desserializar um objeto

( Observe que None é Null em python e estou usando intencionalmente isso para demonstrar como você pode armazenar null e convertê-lo em 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)

insira a descrição da imagem aqui

grepit
fonte