2010-11-28 6 views
5

Ich lerne, wie man mit Simplejson JSON-Datei zu dekodieren. Aber ich hatte den Fehler "ungültig \ escape". Hier ist der Codesimplejson.loads() erhalten Invalid escape: 'x'

import simplejson as json 

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

if __name__ == '__main__': 
    main() 

Und hier ist die Fehlermeldung

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) 

Ich denke, json Parser soll die Flucht erkennen. Ich möchte also wissen, was falsch ist und was ich tun soll.

+2

@pyfunc Danke, ich werde versuchen, meine Frage auch beim nächsten Mal zu formatieren. :) – kkpattern

Antwort

8

JSON hat keine hex escape (\xNN) wie einige Sprachen (einschließlich JavaScript) und Notationen tun, details here. Es hat einen Unicode-Escape, \uNNNN, wobei NNNN vier Hexadezimalziffern ist, aber kein \x hex escape.

+0

Danke. Wenn also die JSON-Datei \ x-Notation hat, sollte ich sie zuerst selbst konvertieren? – kkpattern

+6

@ user308587: Wenn die Datei '\ x'-Notation hat, ist sie nicht im JSON-Format. Wenn Sie trotzdem JSON ungültig akzeptieren wollen, ja, müssen Sie es selbst vorverarbeiten. Angenommen, Sie möchten das '\ x' so behandeln, wie es JavaScript tut, konvertieren Sie' \ xNN' in '\ u00NN' (z. B.' \ x27' wird zu '\ u0027'). FWIW, wie '\ x' und' \ u 'von JavaScript behandelt werden - ** nicht ** JSON - ist in Abschnitt 7.8.4 der [ECMAScript-Spezifikation] (http://www.ecma-international.org) enthalten. org/publications/standards/Ecma-262.htm). Aber bei meinem Lesen geht es nur darum, das 'x' in ein' u' zu ändern und die führenden Nullen hinzuzufügen. Am besten, –

+0

@ T.J.Crowder Können Sie bitte "nur eine Frage der Änderung der x zu einem u und die führenden Nullen" erarbeiten? Wie mache ich mit einem Zeichen, das Teil einer großen Zeichenfolge ist? – Volatil3

2

Dies ist das erwartete Verhalten eines Parsers, da JSON ungültig ist. innerhalb einer Zeichenkette ein Schrägstrich kann nur durch ", \, /, b, f, n, r, tu oder folgen (die durch 4 Hexadezimalzeichen dann befolgt werden müssen). Eine x ist nicht erlaubt. Siehe die Spezifikation bei http://json.org/

0

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