Codificación Python JSON
plotly python (7)
Creo que simplemente estás intercambiando volquetes y cargas .
>>> import json
>>> data = [[''apple'', ''cat''], [''banana'', ''dog''], [''pear'', ''fish'']]
El primero devuelve como una cadena (codificada en JSON) su argumento de datos:
>>> encoded_str = json.dumps( data )
>>> encoded_str
''[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]''
El segundo hace lo contrario, devolviendo los datos correspondientes a su argumento de cadena (codificado en JSON):
>>> decoded_data = json.loads( encoded_str )
>>> decoded_data
[[u''apple'', u''cat''], [u''banana'', u''dog''], [u''pear'', u''fish'']]
>>> decoded_data == data
True
Estoy tratando de codificar datos a JSON en Python y he estado teniendo muchos problemas. Creo que el problema es simplemente un malentendido.
Soy relativamente nuevo en Python y nunca me familiaricé con los diversos tipos de datos de Python, así que eso es lo que más me molesta.
Actualmente estoy declarando una lista, recorriendo en bucle y otra lista, y agregando 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 yo:
- No entiendo la sintaxis de JSON
- No entiendo los módulos JSON de Pythons
- Estoy usando un tipo de datos inapropiado.
En simplejson
(o la biblioteca json
en Python 2.6 y simplejson
posteriores), las loads
toman una cadena JSON y devuelven una estructura de datos Python, dumps
toman una estructura de datos Python y devuelven una cadena JSON. La cadena JSON puede codificar matrices de Javascript, no solo objetos, y una lista de Python corresponde a una cadena JSON que codifica una matriz. Para obtener una cadena JSON como
{"apple":"cat", "banana":"dog"}
El objeto Python que pasas a json.dumps
podría ser:
dict(apple="cat", banana="dog")
aunque la cadena JSON también es válida como sintaxis de Python para el mismo dict
. Sin embargo, creo que la cadena específica que dice que espera es simplemente una sintaxis JSON no válida.
Entonces, simplejson.loads toma una cadena json y devuelve una estructura de datos, por lo que está obteniendo ese error de tipo allí.
simplejson.dumps (data) regresa con
''[["apple", "cat"], ["banana", "dog"], ["pear", "fish"]]''
Que es una matriz json, que es lo que quieres, ya que le diste una matriz python.
Si desea obtener una sintaxis de tipo "objeto", debería hacerlo
>>> data2 = {''apple'':''cat'', ''banana'':''dog'', ''pear'':''fish''}
>>> simplejson.dumps(data2)
''{"pear": "fish", "apple": "cat", "banana": "dog"}''
que es javascript saldrá como un objeto.
JSON usa corchetes para las listas ( [ "one", "two", "three" ]
) y corchetes para los diccionarios 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ías 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 JSON válido. UNA
Las lists
Python se traducen a arrays
JSON. Lo que te está dando es una cadena JSON perfectamente válida que podría usarse en una aplicación de Javascript. Para obtener lo que esperaba, necesitaría usar un dict
:
>>> json.dumps({''apple'': ''cat'', ''banana'':''dog'', ''pear'':''fish''})
''{"pear": "fish", "apple": "cat", "banana": "dog"}''
Los datos que está codificando son una matriz sin llave, por lo que JSON los codifica con corchetes []. Ver www.json.org para más información sobre eso. Las llaves se utilizan para listas con pares clave / valor.
Desde www.json.org:
JSON está construido sobre dos estructuras:
Una colección de pares de nombre / valor. En varios idiomas, esto se realiza como un objeto, registro, estructura, diccionario, tabla hash, lista con clave 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 nombre / valor. Un objeto comienza con {(corchete izquierdo) y termina con} (tirante derecho). Cada nombre va seguido por: (dos puntos) y los pares nombre / valor están separados por, (coma).
Una matriz es una colección ordenada de valores. Una matriz comienza con [(corchete izquierdo) y termina con] (corchete derecho). Los valores están separados por, (coma).
Tratar:
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: Basado en la respuesta de Paolo.