Come analizzare JSON in Python?


282

Il mio progetto sta attualmente ricevendo un messaggio JSON in Python di cui ho bisogno per ottenere alcune informazioni. Ai fini di questo, impostiamolo su un semplice JSON in una stringa:

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

Finora ho generato richieste JSON usando un elenco e poi json.dumps, ma per fare il contrario penso che dovrei usare json.loads. Tuttavia non ho avuto molta fortuna con esso. Qualcuno potrebbe fornirmi uno snippet che ritornerebbe "2"con l'input dell'esempio "two"sopra?


8
Nota : per quelli che vengono qui con dati che usano 'delimitatori di stringa a virgoletta singola, è possibile che siano state invece create accidentalmente rappresentazioni di stringa per i dizionari Python. JSON utilizzerà sempre i "delimitatori . In tal caso, ripara il tuo codice che produce quell'output da utilizzare al json.dumps()posto di str()o repr(), e vai su Converti una rappresentazione in formato stringa di un dizionario in un dizionario? per capire come recuperare i tuoi dati Python. Altri indizi hai un Python letterale? Cerca None, Trueoppure False, JSON userebbe null, true& false.
Martijn Pieters

Coloro che non hanno un jsonStr ma un elenco di dizionari (possibilmente con 'delimitatori di stringa a virgoletta singola), danno anche un'occhiata qui: stackoverflow.com/questions/41168558/…
Lorenz

Risposte:


493

Molto semplice:

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

Inoltre, dai un'occhiata a simplejson se hai bisogno di prestazioni migliori. Le versioni più recenti offrono ottimizzazioni che migliorano notevolmente la lettura e la scrittura.
unode

2
In realtà sto usando simplejson già: import simplejson as json. Ho dimenticato di menzionarlo, ma grazie :)
ingh.am,

Fatto. Stava usando il .loadmetodo invece di.loads
Sunil Kumar il

85

A volte il tuo json non è una stringa. Ad esempio, se ricevi un json da un URL come questo:

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

dovrai usare json.load, non json.loads:

j_obj = json.load(j)

(è facile da dimenticare: la 's' sta per 'stringa')


Solo per aggiungere che è possibile ottenere il contenuto della stringa chiamando j.read () e quindi utilizzare il metodo load. In ogni caso in questo caso il metodo load () si occupa di chiamare il file .read ()
rkachach il

51

Per URL o file, utilizzare json.load(). Per la stringa con contenuto .json, utilizzare 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']

26

Di seguito è riportato un semplice esempio che può aiutarti:

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)

L'output per il codice sopra sarà:

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

Si noti che è possibile impostare l'argomento ident di dump per stamparlo in questo modo (ad esempio, quando si utilizza print json.dumps (data, indent = 4)):

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

-2

Può usare i moduli json o 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

1
Non puoi usare la ast.literal_eval()funzione per JSON, perché al di là dei tuoi banali esempi di solo testo e numeri interi incontrerai dei problemi. JSON non è Python . Solo perché alcuni JSON possono essere analizzati ast.literal_eval()non lo rende un approccio adeguato.
Martijn Pieters

1
Ad esempio, non è possibile analizzare r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'utilizzando ast.literal_eval(), poiché contiene valori null, un valore booleano e un singolo punto di codice non BMP. JSON rappresenta questi valori in modo diverso da come i letterali Python li rappresenterebbero. json.loads()d'altra parte, non ha problemi con questo input e corretta decodifica che a {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
Successivamente, ast.literal_eval()è un po 'più lento e non può essere personalizzato. Non dovresti mai usarlo per decodificare JSON .
Martijn Pieters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.