【发布时间】:2011-11-12 05:52:16
【问题描述】:
是否有在 Python 中输出布尔值的最佳实践?我正在生成一些 JSON(通过 Django 模板),默认情况下,所有布尔值都以大写的前导字符输出,这与 JSON 标准相反(即“True”而不是“true”)。
目前,我使用 str.lower() 格式化每个布尔字符串,但有没有更好的方法?
【问题讨论】:
标签: python django string json boolean
是否有在 Python 中输出布尔值的最佳实践?我正在生成一些 JSON(通过 Django 模板),默认情况下,所有布尔值都以大写的前导字符输出,这与 JSON 标准相反(即“True”而不是“true”)。
目前,我使用 str.lower() 格式化每个布尔字符串,但有没有更好的方法?
【问题讨论】:
标签: python django string json boolean
好吧,然后使用 json 序列化为 JSON,而不是一些自定义的东西。
import json
print json.dumps({'foo': True}) # => {"foo": true}
【讨论】:
这样做的方法是不使用模板。使用json 模块,如下:
import json
def my_view(request):
# ...
json_d = dict(...)
return json.dumps(json_d)
我首选的方法是编写一个装饰器,然后返回一个字典。
def json_view(f):
def wrapped_f(*args, **kwargs):
return json.dumps(f(*args, **kwargs))
wrapped_f.original = f # for unit testing
return wrapped_f
@json_view
my_view(request):
# ...
return dict(...)
【讨论】:
使用json module:
>>> import json
>>> json.dump(dict(value=True), sys.stdout)
{"value": true}
【讨论】:
更好的方法是避免手动或通过 Django 模板生成 JSON,而是使用适当的 JSON 库。在 Python 2.6+ 中,这就像 import json 一样简单。在较旧的 Python 中,您需要 pip install simplejson 和 import simplejson as json。
您自己生成正确的 JSON 可能很困难 - 您手动序列化 bool 值的经验只是一个开始。再举一个例子,用嵌套引号正确转义字符串怎么样?
【讨论】:
simplejson 模块的一个版本,如果json 模块可用,那么它就会被透明地使用。只需将其导入即可获得最佳可用选项:from django.utils import simplejson 或 from django.utils import simplejson as json