Симплэйсон сбрасывает чар \ - PullRequest
0 голосов
/ 04 мая 2010

Я программирую с django, и мне нужно сериализовать объект в строку, но мне нужно получить строку / сериализовать.

Пример:

simplejson.dumps ({'id': 'root / leaf'})

Мне нужен такой вывод:

'{"id": "root / leaf"}'

но я получаю это:

'{"id": "root \\\\ leaf"}'

Спасибо !!

PD: Извините за мой английский: -P

1 Ответ

1 голос
/ 04 мая 2010

JSON требует, чтобы буквальный символ \ был экранирован и представлен как \\. Python также представляет буквально экранированный символ \, как \\. Между двумя из них \ становится \\\\.

Обратите внимание на следующее в Python:

>>> "\\/" == "\/"
True

>>> {"id": "root\/leaf"} == {"id": "root\\/leaf"}
True

>>> {"id": "root\\/leaf"}["id"]
'root\\/leaf'

>>> print {"id": "root\\/leaf"}["id"]
root\/leaf 

Python печатает дополнительный escape. Поэтому, когда вы делаете simplejson.dumps({"id": "root\/leaf"}), python печатает правильный результат {'id': 'root\\/leaf'}, но с дополнительными выходами Python, следовательно, {'id': 'root\\\\/leaf'}. Python рассматривает каждый \\ как один символ. Если вы записываете в файл вместо строки, вы получите {'id': 'root\\/leaf'}.

Редактировать: Я мог бы добавить, что литерал JSON {"id": "root\/leaf"} будет декодироваться в {'id': 'root/leaf'}, а литерал JSON \/ отображается в символ /. И \/, и / являются действительными кодировками JSON /; Кажется, не существует простого способа заставить simplejson использовать \/ вместо / для кодирования /.

...