2009-12-19 13 views
26

que tienen una siguiente cadena JSON procedente de la fuente de entrada externa:Cómo analizar un JSON algo incorrecto con Python?

{value: "82363549923gnyh49c9djl239pjm01223", id: 17893} 

Este es el string-mal con formato JSON ("id" y "valor" debe estar entre comillas), pero tengo que analizar todos modos. He probado simplejson y json-py y parece que no se pudieron configurar para analizar esas cadenas.

Estoy ejecutando Python 2.5 en el motor de la aplicación Google, por lo que cualquier solución basada en C como python-cjson no es aplicable.

El formato de entrada podría cambiarse a XML o YAML, además del JSON mencionado anteriormente, pero estoy usando JSON dentro del proyecto y cambiar el formato en un lugar específico no sería muy bueno.

Ahora he cambiado a XML y analizo los datos con éxito, pero esperando cualquier solución que me permita volver a JSON.

+0

Estoy un poco confundido acerca de cómo se puede cambiar a XML, pero no controlar los datos JSON. Parece que tiene alguna fuente de datos externa, ya sea en formatos XML o JSON, pero su salida JSON está permanentemente rota como se muestra y no puede hacer nada al respecto, por lo que su única opción es seleccionar la versión XML en su lugar. ¿O me estoy perdiendo algo? –

+0

puede analizarlo como YAML sin ningún cambio, porque también es YAML – mykhal

+0

Peter, tiene razón, tengo una fuente de datos externa que podría controlar solo de una manera, diciendo que quiero una entrada en JSON, XML o YAML. Nadia, gracias - ese es mi error (y debido a que no estoy muy familiarizado con la interfaz de Stackoverflow en ese momento). –

Respuesta

31

desde YAML (> = 1.2) es un superconjunto de JSON, que puede hacer:

>>> import yaml 
>>> s = '{value: "82363549923gnyh49c9djl239pjm01223", id: 17893}' 
>>> yaml.load(s) 
{'id': 17893, 'value': '82363549923gnyh49c9djl239pjm01223'} 
+0

, python-yaml (PyYAML) aún no es totalmente compatible con 1.2, pero se encargará de la mayoría de los casos. para estar preparado para los casos problemáticos, consulte http://en.wikipedia.org/wiki/YAML#cite_ref-6 – mykhal

+0

mykhal, ¿lo ha ejecutado en Google App Engine? Parece que PyYAML usa módulos C y por lo tanto no se puede usar en GAE. –

+0

pyyaml ​​es mucho más rápido, si usa libyaml, pero también está escrito en python puro, y puede elegir entre CLoader o Loader (py pura). Pero no se preocupe, el soporte de yaml ya está incluido en el motor de la aplicación, puede probarlo en el shell interactivo http://shell.appspot.com/ – mykhal

1

Puede usar un analizador de cadenas para solucionarlo primero, una expresión regular podría hacerlo siempre que sea tan complicado como el JSON.

+0

Esto es posible, pero estoy considerando este tipo de solución como extraña, así que por ahora solo estoy buscando una biblioteca de análisis json que pueda procesar este JSON roto. –

0

Pyparsing incluye un analizador JSON ejemplo, aquí está el online source. Puede modificar la definición de memberDef para permitir una cadena que no esté entre comillas para el nombre del miembro, y luego puede usar esto para analizar su texto fuente que no es del todo JSON.

This page también tiene información y un enlace a mi artículo en la edición de agosto de 2008 de Python Magazine, que tiene mucha más información detallada sobre este analizador. La página muestra algunos JSON de muestra, y código que accede a los resultados analizados como si fuera un objeto deserializado.

13

Puede usar demjson.

>>> import demjson 
>>> demjson.decode('{foo:3}') 
{u'foo': 3} 
+0

Eso me ayudó a analizar JSON sin comillas y con un formato que difiere de yaml – varela

+0

paquete muy útil para analizar json roto, gracias – Johnner