#python #json #django-templates
#питон #json #django-шаблоны #python
Вопрос:
Есть ли способ, чтобы json.dumps python «пропускал» определенные ключи, чтобы определенные значения записывались непосредственно в тег?
Например
data = {'a_number': 42, 'a_string': 'foo'}
data['a_json_encoded_object'] = '{"foo": "bar"}' #this is a string being read from the DB
dumped = json.dumps(data)
Затем в HTML-файле, используя Django
<script>
var data = {{dumped}}
</script>
Это приводит к html:
var data = {"a_json_encoded_object": "{\"foo\": \"bar\"}", "a_string": "foo", "a_number": 42}
Но то, что я хочу, это:
var data = {"a_json_encoded_object": {"foo": "bar"}, "a_string": "foo", "a_number": 42}
Есть ли способ сделать это?
Т.е. чтобы сообщить json.dumps: для ключа ‘a_json_encoded_object’ вообще не манипулируйте значением и запишите его в json непосредственно после «a_json_encoded_object»:
Если нет, то какова наилучшая практика для получения строки в формате JSON из базы данных в память браузера? Для справки, прямо сейчас я использую JSON.parse, но это грязно.
Комментарии:
1.
json
Модуль не поддерживает какой-либо способ сообщить ему: «мы уже сериализовали эту часть для вас». Ближе всего к этомуdefault
методjson.JSONEncoder
, который должен возвращать объект для сериализации, без возможности выполнения самой сериализации. Могут быть сторонние модули, которые поддерживают такую вещь, но я не знаю ни одного. Лучший вариант, о котором я знаю, — это разобрать'{"foo": "bar"}'
часть сjson.loads
помощью just sojson.dumps
, чтобы повторно сериализовать ее, что может быть расточительным.2. Спасибо. Я надеялся, что там будет пользовательский кодировщик, как вы упомянули. Надеюсь, кто-нибудь знает об одном из них. Как вы говорите, json.loads расточителен — я мог бы также придерживаться JSON.parse на стороне клиента, поскольку он у меня уже есть.
Ответ №1:
Итак, то, чего вы пытаетесь достичь, — это эффект
data['a_json_encoded_object'] = {"foo": "bar"}
И у вас есть строка
'{"foo": "bar"}'
Из базы данных.
Просто используйте json.loads
, чтобы преобразовать вашу строку обратно в словарь Python
>>> json.loads('{"foo": "bar"}')
{u'foo': u'bar'}
Итак
data['a_json_encoded_object'] = json.loads('{"foo": "bar"}')
Что совпадает с
data['a_json_encoded_object'] = {"foo": "bar"}
В вашем шаблоне Django
<script>
var data = {{ dumped|safe }} // Mark as safe so quotations won't be escaped
</script>
Который оказывает на
var data = {"a_json_encoded_object": {"foo": "bar"}, "a_string": "foo", "a_number": 42}
Комментарии:
1. Спасибо. Хотя это работает, это не менее сложно, чем JSON.parse, который я уже делаю на стороне клиента. Но это действительно дает правильный результат 🙂
2. Это также полностью Python-решение.