2009-06-11 30 views
46

Estoy tratando de codificar datos en JSON en Python y he estado teniendo un gran problema. Creo que el problema es simplemente un malentendido.Codificación de Python JSON

Soy relativamente nuevo en Python y nunca me familiaricé realmente con los diversos tipos de datos de Python, por lo que es muy probable que lo que me está causando problemas.

Actualmente estoy declarando una lista, recorriendo y otra lista, y anexar una lista dentro de otra:

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

Así que ya sea:

  • No entiendo JSON Sintaxis
  • No entiendo los módulos de Python JSON
  • Estoy usando un tipo de datos inapropiado.

Respuesta

60

Python lists traducir a JSON arrays. Lo que le está dando es una cadena JSON perfectamente válida que podría usarse en una aplicación de Javascript. Para conseguir lo que se esperaba, lo que tendría que utilizar un dict:

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

Los datos que está codificando son una matriz sin llave, por lo que JSON los codifica con corchetes []. Visite www.json.org para obtener más información al respecto. Las llaves se utilizan para listas con pares clave/valor.

De www.json.org:

JSON se basa en dos estructuras:

Una colección de pares nombre/valor. En varios idiomas, esto se realiza como un objeto, registro, estructura, diccionario, tabla hash, lista de teclas o matriz asociativa . Una lista ordenada de valores. En la mayoría de los idiomas, esto se realiza como una matriz , vector, lista o secuencia.

Un objeto es un conjunto desordenado de pares de nombre/valor. Un objeto comienza con {(llave izquierda) y termina con} (llave derecha). Cada nombre se sigue por: (dos puntos) y los pares de nombre/valor están separados por, (coma).

Una matriz es una colección ordenada de valores. Una matriz comienza con [(left bracket) y termina con] (right bracket). Los valores están separados por, (coma).

17

En simplejson (o la biblioteca json en Python 2.6 y posterior), loads toma una cadena JSON y devuelve una estructura de datos de Python, dumps toma una Estructura de datos Python y devuelve una cadena JSON. La cadena JSON puede codificar matrices Javascript, no solo objetos, y una lista Python corresponde a una cadena JSON que codifica una matriz.Para obtener una cadena JSON como

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

el objeto de Python que se pasa a json.dumps podría ser:

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

pesar de que la cadena JSON es también la sintaxis de Python válida para el mismo dict. Sin embargo, creo que la cadena específica que dices esperar es simplemente una sintaxis JSON no válida.

3

JSON utiliza corchetes para listas ([ "one", "two", "three" ]) y llaves para diccionarios de clave/valor (también llamados objetos en JavaScript, {"one":1, "two":"b"}).

El volcado es bastante correcto, se obtiene una lista de tres elementos, cada uno es una lista de dos cadenas.

si quería un diccionario, tal vez algo como esto:

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

su cadena esperada ('{{"apple":{"cat"},{"banana":"dog"}}') no es válida JSON. A

3

Por lo tanto, simplejson.loads toma una cadena json y devuelve una estructura de datos, por lo que está obteniendo ese tipo de error allí.

simplejson.dumps (datos) vuelve con

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

¿Qué es una matriz JSON, que es lo que quiere, ya que se dio esta matriz de una serpiente pitón.

Si desea obtener una sintaxis de tipo "objeto" debe en su lugar hacer

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

que es javascript va a salir como un objeto.

3

Probar:

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: En base a la respuesta de Paolo.

19

Creo que simplemente está intercambiando descargas y cargas.

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

Los primeros retornos como un (JSON codificado) string su argumento de datos:

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

El segundo hace lo contrario, la devolución de los datos correspondientes a su (JSON codificado) argumento de cadena:

>>> decoded_data = json.loads(encoded_str) 
>>> decoded_data 
[[u'apple', u'cat'], [u'banana', u'dog'], [u'pear', u'fish']] 
>>> decoded_data == data 
True