json.dumps“跳过”特定键?

Posted

技术标签:

【中文标题】json.dumps“跳过”特定键?【英文标题】:json.dumps 'skip over' specific keys? 【发布时间】: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,因为我已经有了它。 【参考方案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解决方案。

以上是关于json.dumps“跳过”特定键?的主要内容,如果未能解决你的问题,请参考以下文章

python的json模块的dumps,loads,dump,load方法介绍

python中的dumps和loads区别

python中的json.dump()和json.dumps()有啥区别?

python中json库中的loadloadsdumpdumps的区别与用法

Python中json.dump()和json.dumps()的区别

json.dumps 和 json.load 有啥区别? [关闭]