2012-09-20 33 views
6

Me pregunto si hay una forma de decodificar una cadena similar a JSON.Cómo decodificar una cadena json no válida en python

que tiene cadena:

'{ hotel: { id: "123", name: "hotel_name"} }' 

No es una cadena JSON válida, por lo que no puede decodificar directamente con la API de Python. Python sólo aceptará una cadena JSON stringified como:

'{ "hotel": { "id": "123", "name": "hotel_name"} }' 

donde las propiedades son citados a ser una cadena.

Respuesta

9

Utilice el módulo demjson, que tiene la capacidad de decodificar en modo no estricto.

In [1]: import demjson 
In [2]: demjson.decode('{ hotel: { id: "123", name: "hotel_name"} }') 
Out[2]: {u'hotel': {u'id': u'123', u'name': u'hotel_name'}} 
+0

no sabía nada de ese módulo - tendrá que comprobar que fuera + 1 –

+0

Neat, usará este módulo! +1. – Aesthete

+0

Los módulos personalizados de Sea of ​​Python .... – u8y7541

3

Se podría tratar de utilizar un envoltorio para un motor de JavaScript, like pyv8.

import PyV8 
ctx = PyV8.JSContext() 
ctx.enter() 
# Note that we need to insert an assignment here ('a ='), or syntax error. 
js = 'a = ' + '{ hotel: { id: "123", name: "hotel_name"} }' 
a = ctx.eval(js) 
a.hotel.id 
>> '123' # Prints 
0

No es muy elegante y no es robusto (y fácil de romper), pero puede ser posible kludge con algo como:

kludged = re.sub('(?i)([a-z_].*?):', r'"\1":', string) 
# { "hotel": { "id": "123", "name": "hotel_name"} } 

Es posible que el uso de pyparsing y el ejemplo parsePythonValue.py podía hacer lo que quiere, así ... (o modificada con bastante facilidad para hacerlo) o la jsonParser.py podría ser modificado para no requerir valores clave citado.

+0

Una explicación de downvoter sería bueno ... –

1

@vartec ya se ha señalado demjson, que funciona bien para JSON ligeramente válido. Para los datos que es incluso menos compatible con JSON que he escrito barely_json:

from barely_json import parse 
print(parse('[no, , {complete: yes, where is my value?}]')) 

impresiones

[False, '', {'complete': True, 'where is my value?': ''}] 
Cuestiones relacionadas