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