python json encoding types simplejson

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.