2010-11-28 16 views
5

Estoy aprendiendo a usar simplejson para decodificar el archivo JSON. Pero sufrí el error "invalid \ escape". Este es el códigosimplejson.loads() get Invalid escape: 'x'

import simplejson as json 

def main(): 
    json.loads(r'{"test":"\x27"}') 

if __name__ == '__main__': 
    main() 

Y aquí es el mensaje de error

Traceback (most recent call last): 
    File "hello_world.py", line 7, in <module> 
    main() 
    File "hello_world.py", line 4, in main 
    json.loads(r'{"test":"\x27"}') 
    File "C:\Users\zhangkai\python\simplejson\__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 335, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 351, in raw_decode 

    obj, end = self.scan_once(s, idx) 
    File "C:\Users\zhangkai\python\simplejson\scanner.py", line 36, in _scan_once 
    return parse_object((string, idx + 1), encoding, strict, _scan_once, object_ 
hook) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 185, in JSONObject 

    value, end = scan_once(s, end) 
    File "C:\Users\zhangkai\python\simplejson\scanner.py", line 34, in _scan_once 
    return parse_string(string, idx + 1, encoding, strict) 
    File "C:\Users\zhangkai\python\simplejson\decoder.py", line 114, in py_scanstr 
ing 
    raise ValueError(errmsg(msg, s, end)) 
ValueError: Invalid \escape: 'x': line 1 column 10 (char 10) 

Creo analizador JSON se supone reconocer el escape. Entonces quiero saber qué está mal y qué debo hacer.

+2

@pyfunc Gracias, voy a tratar de dar formato a mi pregunta así la próxima vez. :) Gracias – kkpattern

Respuesta

8

JSON no tiene escape hexadecimal (\xNN) como algunos idiomas (incluido JavaScript) y notaciones do, details here. Tiene un escape Unicode, \uNNNN donde NNNN tiene cuatro dígitos hexadecimales, pero no \x escape hexadecimal.

+0

. Entonces, si el archivo JSON tiene \ x notación, ¿debería convertirlo primero? – kkpattern

+6

@ user308587: si el archivo tiene la notación '\ x', no está en formato JSON. Si desea aceptar JSON no válido de todos modos, sí, tendría que preprocesarlo usted mismo. Suponiendo que desea tratar el '\ x' como lo hace JavaScript, convierta' \ xNN' en '\ u00NN' (por ejemplo,' \ x27' se convierte en '\ u0027'). FWIW, cómo '\ x' y' \ u' son manejados por JavaScript - ** no ** JSON - está cubierto por la Sección 7.8.4 de [la especificación de ECMAScript] (http: //www.ecma-international. org/publications/standards/Ecma-262.htm). Pero mi lectura es que realmente solo se trata de cambiar la 'x' por una' u' y agregar los ceros a la izquierda. Mejor, –

+0

@ T.J.Crowder ¿Puedes por favor elaborar 'solo una cuestión de cambiar la x a una uy agregar los ceros a la izquierda'? ¿Cómo hago con un personaje que es parte de una gran cadena? – Volatil3

2

Este es el comportamiento esperado de un analizador ya que ese JSON no es válido; dentro de una cadena una barra puede ser seguido únicamente por ", \, /, b, f, n, r, t o u (que luego debe ser seguida de 4 caracteres hexadecimales). No se permite un x. Ver la especificación en http://json.org/

0

tratar python-cjson

import cjson 
s = cjson.encode({'abc':123,'def':'xyz'}) 
print 'json: %s - %s' % (type(s), s) 
s = cjson.decode(s) 
print '%s - %s' % (type(s), s)