2009-06-11 14 views
46

Sto provando a codificare i dati su JSON in Python e ho avuto un bel po 'di problemi. Credo che il problema sia semplicemente un fraintendimento.Codifica Python JSON

Sono relativamente nuovo a Python e non ho mai avuto veramente familiarità con i vari tipi di dati Python, quindi è molto probabile che cosa mi stia rovinando.

attualmente sto dichiarazione di una lista, scorrendo e un altro elenco, e aggiungendo una lista all'interno di un altro:

import simplejson, json 
data = [['apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']] 

x = simplejson.loads(data) 
# >>> typeError: expected string or buffer.. 

x = simplejson.dumps(stream) 
# >>> [["apple", "cat"], ["banana", "dog"], ["pear", "fish"]] 
# - shouldn't JSON encoded strings be like: {{"apple":{"cat"},{"banana":"dog"}} 

Così ho uno:

  • non capisco JSON Sintassi
  • Non capisco il/i modulo/i Python Python
  • Sto utilizzando un tipo di dati inappropriato.

risposta

60

Python lists tradurre in JSON arrays. Quello che ti sta dando è una stringa JSON perfettamente valida che potrebbe essere usata in un'applicazione Javascript. Per ottenere ciò che vi aspettavate, si avrebbe bisogno di utilizzare un dict:

>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'}) 
'{"pear": "fish", "apple": "cat", "banana": "dog"}' 
4

I dati che si codifica sono un array senza chiave, quindi JSON lo codifica con parentesi []. Vedi www.json.org per maggiori informazioni al riguardo. Le parentesi graffe vengono utilizzate per elenchi con coppie chiave/valore.

Da www.json.org:

JSON è costruito su due strutture:

collezione di coppie nome/valore. In varie lingue, questo è realizzato come un oggetto, record, struct, dizionario, tabella hash, elenco con chiave o associativa array. Un elenco ordinato di valori. Nella maggior parte delle lingue, , questo viene realizzato come un array, vettore, elenco o sequenza .

Un oggetto è un insieme non ordinato di coppie nome/valore . Un oggetto inizia con {(parentesi sinistra) e termina con} (parentesi graffa destra). Ogni nome è seguito da: (due punti) e le coppie nome/valore sono separate da, (virgola).

Un array è una raccolta ordinata di valori . Un array inizia con [(parentesi sinistra ) e termina con] (parentesi destra ). I valori sono separati da, (virgola).

17

In simplejson (o la libreria json in Python 2.6 e versioni successive), loads prende una stringa JSON e restituisce una struttura dati Python, dumps prende un Struttura dati Python e restituisce una stringa JSON. La stringa JSON può codificare gli array Javascript, non solo gli oggetti, e un elenco Python corrisponde a una stringa JSON che codifica una matrice.Per ottenere una stringa JSON come

{"apple":"cat", "banana":"dog"} 

l'oggetto Python si passa a json.dumps potrebbe essere:

dict(apple="cat", banana="dog") 

se la stringa JSON è anche la sintassi Python valido per lo stesso dict. Credo che la stringa specifica che dici sia semplicemente la sintassi JSON non valida, comunque.

3

JSON utilizza parentesi quadre per gli elenchi ([ "one", "two", "three" ]) e parentesi graffe per i dizionari chiave/valore (chiamati anche oggetti in JavaScript, {"one":1, "two":"b"}).

Il dump è abbastanza corretto, si ottiene un elenco di tre elementi, ognuno dei quali è un elenco di due stringhe.

se si voleva un dizionario, forse qualcosa di simile:

x = simplejson.dumps(dict(data)) 
>>> {"pear": "fish", "apple": "cat", "banana": "dog"} 

la stringa di attesa ('{{"apple":{"cat"},{"banana":"dog"}}') non è valida JSON. A

3

Quindi, simplejson.loads accetta una stringa json e restituisce una struttura dati, motivo per cui si sta verificando quell'errore di tipo.

simplejson.dumps (dati) torna con

'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]' 

Che è un array JSON, che è ciò che si vuole, dal momento che ti ha dato questo array un pitone.

Se si desidera ottenere una sintassi di tipo "oggetto" si dovrebbe invece fare

>>> data2 = {'apple':'cat', 'banana':'dog', 'pear':'fish'} 
>>> simplejson.dumps(data2) 
'{"pear": "fish", "apple": "cat", "banana": "dog"}' 

che è javascript uscirà come un oggetto.

3

Prova:

import simplejson 
data = {'apple': 'cat', 'banana':'dog', 'pear':'fish'} 
data_json = "{'apple': 'cat', 'banana':'dog', 'pear':'fish'}" 

simplejson.loads(data_json) # outputs data 
simplejson.dumps(data) # outputs data_joon 

NB: in base alla risposta di Paolo.

19

Penso che si stia semplicemente scambiando discariche e carichi.

>>> import json 
>>> data = [['apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']] 

Il primo restituisce come (JSON codificato) stringa sua tesi di dati:

>>> encoded_str = json.dumps(data) 
>>> encoded_str 
'[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]' 

La seconda fa il contrario, restituire i dati corrispondenti alla sua (JSON codificata) argomento stringa: