Правильный JSON:
r'{"FileExists": true, "Version": "4.3.2.1", "Path": "\\\\host\\dir\\file.exe"}'
Обратите внимание на букву r
, если вы ее опустите, вам нужно экранировать \
и для Python.
>>> import json
>>> d = json.loads(s)
>>> d.keys()
[u'FileExists', u'Path', u'Version']
>>> d.values()
[True, u'\\\\host\\dir\\file.exe', u'4.3.2.1']
Обратите внимание на разницу:
>>> repr(d[u'Path'])
"u'\\\\\\\\host\\\\dir\\\\file.exe'"
>>> str(d[u'Path'])
'\\\\host\\dir\\file.exe'
>>> print d[u'Path']
\\host\dir\file.exe
Python REPL по умолчанию печатает repr(obj)
для объекта obj
:
>>> class A:
... __str__ = lambda self: "str"
... __repr__ = lambda self: "repr"
...
>>> A()
repr
>>> print A()
str
Поэтому ваша исходная строка s
неправильно экранирована для JSON. Он содержит неоткрытые '\d'
и '\f'
. print s
должен показывать '\\d'
, иначе это не правильный JSON.
ПРИМЕЧАНИЕ. Строка JSON - это набор из нуля или более символов Юникода, заключенный в двойные кавычки с использованием обратной косой черты ( json.org ). Я пропустил проблемы кодирования (а именно, преобразование байтовых строк в юникод и наоборот) в приведенных выше примерах.