json.dumps «пропускает» конкретные ключи?

#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 so json.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-решение.