Como analisar JSON em Python?

281

No momento, meu projeto está recebendo uma mensagem JSON em python, da qual preciso extrair bits de informações. Para isso, vamos configurá-lo para um JSON simples em uma string:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

Até agora, tenho gerado solicitações JSON usando uma lista e json.dumps, em seguida , mas para fazer o oposto disso, acho que preciso usar json.loads. No entanto, não tive muita sorte com isso. Alguém poderia me fornecer um trecho que retornaria "2"com a entrada do "two"exemplo acima?

ingh.am
fonte
8
Nota : Para aqueles que vêm aqui com dados que usam 'delimitadores de string de aspas simples, você pode ter acidentalmente criado representações de strings para dicionários Python. JSON sempre usará "delimitadores . Em caso afirmativo, repare o código que produz essa saída para usar em json.dumps()vez de str()ou repr()e vá para Converter uma representação String de um Dicionário em um dicionário? para descobrir como recuperar seus dados Python. Outras pistas você tem um literal Python? Procure None, Trueou False, o JSON usaria null, true& false.
Martijn Pieters
Aqueles que não possuem um jsonStr, mas uma lista de dicionários (possivelmente com 'delimitadores de string de aspas simples), também podem dar uma olhada aqui: stackoverflow.com/questions/41168558/…
Lorenz

Respostas:

492

Muito simples:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']
John Giotta
fonte
Além disso, dê uma olhada no simplejson se você precisar de melhor desempenho. Versões mais recentes fornecem otimizações que melhoram muito a leitura e a gravação.
unode 14/10
2
Na verdade, estou usando simplejson já: import simplejson as json. Esqueci de mencionar mas graças :)
ingh.am
Entendi. Estava usando o .loadmétodo em vez de.loads
Sunil Kumar
85

Às vezes, o seu json não é uma string. Por exemplo, se você estiver recebendo um json de um URL como este:

j = urllib2.urlopen('http://site.com/data.json')

você precisará usar o json.load, não o json.loads:

j_obj = json.load(j)

(é fácil esquecer: o 's' é para 'string')

jisaacstone
fonte
Apenas para adicionar que você pode obter o conteúdo da string chamando j.read () e, em seguida, use o método load. De qualquer forma, neste caso, o método load () cuida de chamar o .read ()
rkachach
51

Para URL ou arquivo, use json.load(). Para string com conteúdo .json, use json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']
Mohammad Shahid Siddiqui
fonte
26

A seguir, é apresentado um exemplo simples que pode ajudá-lo:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

A saída para o código acima será:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

Observe que você pode definir o argumento ident do dump para imprimi-lo da seguinte maneira (por exemplo, ao usar print json.dumps (data, indent = 4)):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}
Venkat
fonte
-2

Pode usar os módulos json ou ast python:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2
Biranchi
fonte
1
Você não pode usar a ast.literal_eval()função para JSON, porque além de seus exemplos de texto e-inteiro somente triviais que você vai ter problemas. JSON não é Python . Só porque alguns JSON podem ser analisados ast.literal_eval()não torna essa uma abordagem adequada.
Martijn Pieters
1
Por exemplo, você não pode analisar r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'usando ast.literal_eval(), porque contém nulos, um valor booleano e um único ponto de código não-BMP. JSON representa esses valores de maneira diferente de como os literais Python os representariam. json.loads()por outro lado, não tem problemas com que a entrada correta e decodifica que a {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters
1
Em seguida, ast.literal_eval()é um pouco mais lento e não pode ser personalizado. Você nunca deve usá-lo para decodificar JSON .
Martijn Pieters