simplejson.loads () получить недействительный \ escape: 'x' - PullRequest
7 голосов
/ 28 ноября 2010

Я учусь, как использовать simplejson для декодирования файла JSON.Но я потерпел ошибку «неверный \ побег».Вот код

import simplejson as json

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

if __name__ == '__main__':
    main()

А вот и сообщение об ошибке

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)

Я думаю, что json parser должен распознать побег.Поэтому я хочу знать, что не так и что мне делать.

Ответы [ 3 ]

11 голосов
/ 28 ноября 2010

JSON не имеет шестнадцатеричного экранирования (\xNN), как некоторые языки (включая JavaScript) и нотации, подробности здесь . У него есть экранирование в Unicode, \uNNNN, где NNNN - это четыре шестнадцатеричные цифры, но нет \x шестнадцатеричного экранирования.

2 голосов
/ 28 ноября 2010

Это ожидаемое поведение парсера, поскольку JSON недопустим; внутри строки после косой черты могут следовать только ", \, /, b, f, n, r, t или u (которые должны следуют 4 шестнадцатеричных символа). x не допускается. Смотрите спецификацию на http://json.org/

0 голосов
/ 14 июня 2012

try 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)
...