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中的json.dump()和json.dumps()有啥区别?
python中json库中的loadloadsdumpdumps的区别与用法