8
votes

SimpleJson.Loads () Obtenez invalide \ Escape: 'x'

J'apprends comment utiliser SimpleJson pour décoder le fichier JSON. Mais j'ai souffert de l'erreur "invalide \ Escape". Voici le code

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)


3 Réponses :


12
votes

JSON n'a pas d'évacuation hexagonale ( \ xnn ) comme certaines langues (y compris JavaScript) et des notations do, Détails Ici . Il a une évasion unicode, \ unnnn nnnn est quatre chiffres hexadécimaux, mais aucun \ x s'échappe hexal.


9 commentaires

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


@ user308587: Si le fichier a \ x notation, ce n'est pas au format JSON. Si vous souhaitez accepter un JSON invalide de toute façon, oui, vous devriez le pré-traiter vous-même. En supposant que vous souhaitiez traiter le \ x de la manière dont JavaScript, convertissez \ xnn sur \ u00nn (par exemple, \ x27 devient \ u0027 ). FWIW, comment \ x et \ u est géré par JavaScript - pas JSON - est couvert par la section 7.8.4 de La spécification ECMAScript . Mais ma lecture est que c'est vraiment une question de modification du x à un u et d'ajouter les zéros principaux. Meilleur,


@ T.J.Crowder Pouvez-vous s'il vous plaît élaborer juste une question de changement de x vers un U et d'ajouter les zéros de premier plan ? Comment puis-je faire avec un personnage qui fait partie d'une grande chaîne?


@ Volatil3: disons que vous avez des JSON brute dans une chaîne, par exemple: str = '{"FOO": "Test de bar \\ x23 Test 1 2 3 \\ x23"}' Vous pouvez convertir ces \ u Notation avec un simple remplacement: str2 = str.replace (/ \\ x / g, "\\ u00") puis str2 va réussir à analyser et vous aurez un objet avec une propriété, foo , avec la valeur "barre # test 1 2 3 #" (car \ x23 / \ u0023 est # ).


@ Volatil3: pas charge , json.parse . En supposant que le texte que vous parlez est JSON.


@ T.J.Crowder Il n'y a pas de JSON.PARSE dans Python 2.x


@ Volatil3: ah, je ne me souviens pas que cette question était à l'origine à propos de Python ... mon remplacer ci-dessus peut être suspect aussi (je ne fais pas python, c'était un exemple javascript); Vous devrez le masser dans le python équivalent.


Il est absurde que JSON n'a pas de notation x ; JavaScript eval l'accepte, il est donc valide au format JavaScript valide.


@Vitaliy: eval L'acceptation ne le fait pas JSON. eval accepte également la chaîne (fonction FOO () {alerte ("pas JSON");}) () ( jsfiddle.net/whghsf6o ), mais ce n'est pas JSON non plus. :-) tandis que certains analyseurs JSON réels (par opposition à eval ) acceptent \ xnn notation (V8, par exemple), il n'est pas valide JSON. Détails dans Le site Web JSON relié ci-dessus ainsi que Le RFC et la norme (pdf). \ xnn dans une chaîne est valide javascript , mais pas valide json .



4
votes

Ceci est attendu Comportement d'un analyseur car JSON n'est pas valide; Dans une chaîne, une barre oblique peut être suivie uniquement par ", \ , / , b , f , n , r , t ou u (qui doit ensuite être suivi de 4 caractères hexagonales ). Un x n'est pas autorisé. Voir la spécification sur http://json.org/


0 commentaires

0
votes

Essayez python-cjson xxx


0 commentaires