Python: json.loads дросселирует на Escape

+: SQL-сервер иногда оптимизирует код

+: Вы вынуждены передать параметры, который ограничивает проблемы Внедрения SQL

-: Ваш код зависит от единой базы данных (некоторые dbs даже не имеют SP)

-: Для изменения кода, необходимо соединиться с базой данных

-: Логика не организована хорошо

Лично, я против нее, но я должен был использовать ее однажды на действительно занятом веб-сайте. Используя SP в MS SQL дал огромные преимущества, но после того как я реализовал кэширование тех преимуществ, больше не были настолько большими.

18
задан Chris 1 October 2009 в 17:53
поделиться

2 ответа

Правильный 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 представляет собой набор из нуля или более символов Unicode, заключенных в двойные кавычки, с использованием escape-символов обратной косой черты ( json.org ). В приведенных выше примерах я пропустил вопросы кодирования (а именно, преобразование байтовых строк в Unicode и наоборот).

24
ответ дан 30 November 2019 в 07:44
поделиться
>>> s
'{"FileExists": true, "Version": "4.3.2.1", "Path": "\\\\host\\dir\\file.exe"}'
>>> print s
{"FileExists": true, "Version": "4.3.2.1", "Path": "\\host\dir\file.exe"}

Фактически вы не сбежали строка, поэтому она пытается проанализировать недопустимые escape-коды, такие как \ d или \ f . Подумайте об использовании хорошо протестированного кодировщика JSON, например json2.js .

1
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: