2010-11-28 15 views
5

J'apprends comment utiliser simplejson pour décoder le fichier JSON. Mais j'ai subi l'erreur "invalid \ escape". Voici le codesimplejson.loads() get Invalid escape: 'x'

import simplejson as json 

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

if __name__ == '__main__': 
    main() 

Et voici le message d'erreur

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) 

Je pense que l'analyseur de JSON est censé reconnaître l'évasion. Donc, je veux savoir ce qui ne va pas, et que dois-je faire.

+2

@pyfunc Merci, je vais essayer de formater ma question bien la prochaine fois. :) – kkpattern

Répondre

8

JSON n'a pas d'échappement hexadécimal (\xNN) comme certaines langues (y compris JavaScript) et les notations, details here. Il a un échappement unicode, \uNNNNNNNN est quatre chiffres hexadécimaux, mais pas \x hex échappement.

+0

Merci. Donc, si le fichier JSON a la notation \ x, je devrais le convertir moi-même en premier? – kkpattern

+6

@ user308587: Si le fichier a la notation '\ x', il n'est pas au format JSON. Si vous voulez accepter un JSON invalide de toute façon, oui, vous devrez le pré-traiter vous-même. En supposant que vous voulez traiter le '\ x' comme le fait JavaScript, convertissez' \ xNN' en '\ u00NN' (par exemple,' \ x27' devient '\ u0027'). FWIW, comment '\ x' et' \ u' sont gérés par JavaScript - ** pas ** JSON - est couvert par la section 7.8.4 de [la spécification ECMAScript] (http: //www.ecma-international. org/publications/standards/Ecma-262.htm). Mais ma lecture est vraiment juste de changer le 'x' en un' u' et d'ajouter les zéros en tête. Best, –

+0

@ T.J.Crowder Pouvez-vous élaborer «juste une question de changer le x en u et en ajoutant les zéros de gauche»? Comment faire avec un personnage faisant partie d'une grande chaîne? – Volatil3

2

Ce comportement est attendu d'un analyseur car ce JSON n'est pas valide; dans une chaîne d'une barre oblique peut être suivi par seulement ", \, /, b, f, n, r, t ou u (qui doit alors être suivi de 4 caractères hexadécimaux). Un x n'est pas autorisé. Voir les spécifications à http://json.org/

0

essayer 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)