Converti stringa JSON in dict usando Python


415

Sono un po 'confuso con JSON in Python. A me sembra un dizionario, e per questo motivo sto cercando di farlo:

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

Ma quando lo faccio print dict(json), dà un errore.

Come posso trasformare questa stringa in una struttura e quindi chiamare json["title"]per ottenere "glossario di esempio"?

Risposte:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

9
Qual è la differenza tra json.load e json.loads?
Shivam Agrawal,

5
@ShivamAgrawal: esattamente quello che dice sulla scatola .
Ignacio Vazquez-Abrams,

64
@ShivamAgrawal: la differenza è che .load()analizza un oggetto file; .loads()analizza un oggetto stringa / unicode.
Fyngyrz,

1
Mi preoccupa il fatto che l'autore di questa funzione non abbia scritto una funzione wrapper per eseguire un controllo del tipo sui dati trasmessi per scegliere automaticamente la funzione giusta da chiamare. Inoltre non mi piace la vaga nomenclatura utilizzata. Ecco cosa ho scritto per combattere questo: def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) sono sicuro che questo può essere migliorato, ma ora puoi chiamare d = read_json(j)un json 'str' o 'file'.
Jacques Mathieu,

2
@JacquesMathieu, Ciao Jacques, grazie per la tua funzione, ho apportato un piccolo miglioramento da quando a volte uso dizionari: def read_json (json_data): if (type (json_data) == str): # Per le stringhe return json.loads (json_data) elif (str (type (json_data)) == "<class '_io.TextIOWrapper'>"): #Per i file restituiscono json.load (json_data) elif (type (json_data) == dict): # Per i dizionari restituire json.loads (json.dumps (json_data))
Gabriel Aizcorbe il

98

Quando ho iniziato a usare json, ero confuso e incapace di capirlo per un po 'di tempo, ma finalmente ho ottenuto quello che volevo
Ecco la soluzione semplice

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

Perché sei prima discarica (m)?
Han Van Pham,

L'ho usato per dimostrare la serializzazione e la deserializzazione. Anche l'utilizzo di loads(..)on '{"id": 2, "name": "hussain"}'dovrebbe andare bene come la risposta accettata.
Hussain,

1
discariche e carichi funziona perfettamente per me, mentre la risposta accettata non lo è, grazie mille @Hussain per avermi salvato un time, FYI, sto provando loadsda stringhe dinamiche con codifica utf-8 ...
Mohammed Sufian

19

usa simplejson o cjson per gli speedups

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

Se ti fidi dell'origine dati, puoi utilizzare evalper convertire la stringa in un dizionario:

eval(your_json_format_string)

Esempio:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>

1
La stringa nel tuo esempio non è JSON.
bfontaine,

1
Vero. Passa a un dizionario tho, che può essere facilmente caricato / scaricato come JSON (e ovviamente potresti aver bisogno di una funzione di codifica json personalizzata se il tuo dizionario non ha valori json).
kakhkAzione

3
No. Non devi mai valutare i dati di input come codice. Questo potrebbe essere il tuo piccolo progetto pet che utilizza dati di cui ti fidi, ma il cattivo codice può essere riutilizzato e le cattive pratiche possono essere ripetute in progetti reali, lasciando un grande codice di sicurezza.
NetworkMeister

Ed è per questo che la mia risposta inizia con "se ti fidi dell'origine dati"! Ma è vero, questo è più di un trucco, e sicuramente non è la migliore pratica.
kakhkAzione

Puoi fidarti totalmente dell'origine dati se è tua. Ciò è effettivamente utile per convertire un oggetto JS con stringhe in un dic in una stringa JSON corretta.
Vadorequest,
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.