Как десериализовать (десериализовать) фрагменты HTML в JSON из simplejson.dumps? - PullRequest
0 голосов
/ 19 августа 2011

Я работаю над проектом Django, в котором один из фронтэндов попросил, чтобы для одного из наших запросов ajax он хотел, чтобы я возвратил JSON dict, причем одним из ключей был какой-то отрендеренный HTML из шаблон. Так, например:

d = {
  "hits": 22,
  "page": 3,
  "somehhtml": """<div id='item1'>Something</div><div id='item2'>More Stuff</div>

<p>More after some linebreaks.</p>"""
}

Когда я использую simplejson.dumps, чтобы вернуть это, он экранирует HTML, предположительно, чтобы сделать его действительным JSON, с множеством символов \ n перевода строки и экранированных кавычек.

Как хак, у меня получилось, что я добавил строковый шаблон замены char в dict, прежде чем сериализовать его с помощью dumps (), а затем заменил его отображаемым шаблоном перед отправкой обратно в браузер. Это, очевидно, ужасно, и, конечно, не может быть правильным способом сделать это.

Итак, правильный ли способ справиться с этим, чтобы использовать какой-либо способ десериализации jQuery / JS на клиенте, или мне нужно написать собственный сериализатор на стороне Python, чтобы не избежать некоторых вещей? Я попытался передать его в eval () в JS, но это дает мне SyntaxError.

Существуют ли практические причины, по которым то, что я сейчас делаю (т.е. не избегаю символов), является плохой идеей? (Чтобы помочь мне объяснить, не потому, что я не думаю, что я должен это изменить).

Спасибо!

Людо.

1 Ответ

1 голос
/ 19 августа 2011

Я не понимаю, почему вам нужно удалить строку json, в то время как она должна быть экранирована, чтобы быть допустимой строкой javascript и python?

И, кстати, переводы строк \n не имеют ничего общего с json dumper, просто потому, что значение ключа "somehhtml" представляет собой многострочную строку, содержащую новые строки (что я считаю ошибкой, возможно, вы хотел поставить <br />).

Для краткости приведем код :):

питон

>>> import json
>>> json.dumps(d)
'{"hits": 22, "page": 3, "somehhtml": "<div id=\'item1\'>Something</div><div id=\'item2\'>More Stuff</div>\\n\\n<p>More after some linebreaks.</p>"}'

Javascript

>>> s = '{"hits": 22, "page": 3, "somehhtml": "<div id=\'item1\'>Something</div><div id=\'item2\'>More Stuff</div>\\n\\n<p>More after some linebreaks.</p>"}'
>>> JSON.parse(s)
Object { hits=22, page=3, somehhtml="<div id='item1'>Somethi...er some linebreaks.</p>"}
// eval is not safe, but you should add a parentheses as a workaround  
>>> eval('(' + s + ')')
Object { hits=22, page=3, somehhtml="<div id='item1'>Somethi...er some linebreaks.</p>"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...