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 :
JSON n'a pas d'évacuation hexagonale ( \ xnn code>) comme certaines langues (y compris JavaScript) et des notations do, Détails Ici . Il a une évasion unicode, \ unnnn code> où nnnn code> est quatre chiffres hexadécimaux, mais aucun \ x code> s'échappe hexal. P>
Merci. Donc, si le fichier JSON a \ x notation, je devrais le convertir moi-même en premier?
@ user308587: Si le fichier a \ x code> 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 code> de la manière dont JavaScript, convertissez \ xnn code> sur \ u00nn code> (par exemple, \ x27 code> devient \ u0027 code>). FWIW, comment \ x code> et \ u code> est géré par JavaScript - pas B> 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 code> à un u code> 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 code>? 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"}' code> Vous pouvez convertir ces \ u code> Notation avec un simple remplacement: str2 = str.replace (/ \\ x / g, "\\ u00") code> puis str2 code> va réussir à analyser et vous aurez un objet avec une propriété, foo code>, avec la valeur "barre # test 1 2 3 #" code> (car \ x23 code> / \ u0023 code> est # code>).
@ Volatil3: pas charge code>, json.parse code>. En supposant que le texte que vous parlez est JSON.
@ T.J.Crowder Il n'y a pas de JSON.PARSE CODE> dans Python 2.x
@ Volatil3: ah, je ne me souviens pas que cette question était à l'origine à propos de Python ... mon remplacer code> 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 code>; JavaScript eval code> l'accepte, il est donc valide au format JavaScript valide.
@Vitaliy: eval code> L'acceptation ne le fait pas JSON. eval code> accepte également la chaîne (fonction FOO () {alerte ("pas JSON");}) () code> ( jsfiddle.net/whghsf6o ), mais ce n'est pas JSON non plus. :-) tandis que certains analyseurs JSON réels (par opposition à eval code>) acceptent \ xnn code> 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 code> dans une chaîne est valide javascript i>, mais pas valide json i>.
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 " code>, \ code>, / code>, b code>, f code>, n code>, r code>, t code> ou u code> (qui doit ensuite être suivi de 4 caractères hexagonales ). Un x code> n'est pas autorisé. Voir la spécification sur http://json.org/ p>
Connexes: Double Escape manquant dans Windows File Path: Python - JSON Erreur de lecture JSON .Decoder.jsondecodeError: invalide \ Escape-échappe - Overflow de pile , octal de l'évasion Python - Fixation JSON non valide Scape - Overflow de pile