【问题标题】:json.dumps 'skip over' specific keys?json.dumps“跳过”特定键?
【发布时间】:2014-08-11 19:12:58
【问题描述】:

有没有办法让 python 的 json.dumps '跳过'特定键,以便将某些值直接写入标签?

例如

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}

有没有办法做到这一点? IE。告诉json.dumps:对于键'a_json_encoded_object',根本不要操作值,直接写到json后面"a_json_encoded_object":

如果没有,将 JSON 编码的字符串从数据库中获取到浏览器内存的最佳做法是什么?作为参考,现在我正在使用 JSON.parse,但它很乱。

【问题讨论】:

  • json 模块不支持任何方式告诉它“我们已经为您序列化了这部分”。最接近的是json.JSONEncoder 中的default 方法,它必须返回一个要序列化的对象,而没有执行序列化本身的选项。可能有支持这种东西的第 3 方模块,但我不知道。我所知道的最好的选择是用json.loads 解析'{"foo": "bar"}' 部分,这样json.dumps 就会重新序列化它,这可能很浪费。
  • 谢谢。正如您所提到的,我希望会有一个自定义编码器。希望有人知道。正如你所说,json.loads 很浪费——我还不如坚持在客户端使用 JSON.parse,因为我已经有了它。

标签: python json django-templates


【解决方案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}

【讨论】:

  • 谢谢。虽然这可行,但它的迂回程度不亚于我已经在客户端做的 JSON.parse。但它确实提供了正确的输出:)
  • 也是全Python解决方案。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多