解决方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False})
! data是需要渲染的字典
在使用json.dumps时要注意一个问题 >>> import json >>> print json.dumps('中国') "\u4e2d\u56fd" 输出的会是 '中国' 中的ascii 字符码,而不是真正的中文。 这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False: >>> import json >>> print json.dumps('中国') "\u4e2d\u56fd"
>>> print json.dumps('中国',ensure_ascii=False) "中国"
>>>
1
2
3
|
def
master(request):
data
=
{
'这是'
:
'主页'
}
return
JsonResponse(data, json_dumps_params
=
{
'ensure_ascii'
:
False
})
|
显示效果:
首先我们看JsonResponse()的源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class
JsonResponse(HttpResponse):
def
__init__(
self
, data, encoder
=
DjangoJSONEncoder, safe
=
True
,
json_dumps_params
=
None
,
*
*
kwargs):
if
safe
and
not
isinstance
(data,
dict
):
raise
TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if
json_dumps_params
is
None
:
json_dumps_params
=
{}
kwargs.setdefault(
'content_type'
,
'application/json'
)
data
=
json.dumps(data,
cls
=
encoder,
*
*
json_dumps_params)
super
(JsonResponse,
self
).__init__(content
=
data,
*
*
kwargs)
|
这里我们从根源开始找它编码错误的原因:
JsonResponse()在初始化的时候使用了json.dumps()把字典转换成了json格式,具体方法如下:
1
|
data
=
json.dumps(data,
cls
=
encoder,
*
*
json_dumps_params)
|
接下来我们看看json.dumps()的源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def
dumps(obj, skipkeys
=
False
, ensure_ascii
=
True
, check_circular
=
True
,
allow_nan
=
True
,
cls
=
None
, indent
=
None
, separators
=
None
,
default
=
None
, sort_keys
=
False
,
*
*
kw):
if
(
not
skipkeys
and
ensure_ascii
and
check_circular
and
allow_nan
and
cls
is
None
and
indent
is
None
and
separators
is
None
and
default
is
None
and
not
sort_keys
and
not
kw):
return
_default_encoder.encode(obj)
if
cls
is
None
:
cls
=
JSONEncoder
return
cls
(skipkeys
=
skipkeys, ensure_ascii
=
ensure_ascii,
check_circular
=
check_circular, allow_nan
=
allow_nan,
indent
=
indent,separators
=
separators, default
=
default,
sort_keys
=
sort_keys,
*
*
kw).encode(obj)
|
源码注释原文:If ``ensure_ascii`` is false, then the return value can contain non-ASCII characters if they appear in strings contained in ``obj``. Otherwise, all such characters are escaped in JSON strings.
也就是说ensure_ascii是false的时候,可以返回非ASCII码的值,否则就会被JSON转义。
所以含有中文的字典转json字符串时,使用 json.dumps() 方法要把ensure_ascii参数改成false,即 json.dumps(dict,ensure_ascii=False)。
JsonResponse()接收参数有关键词参数,json_dumps_params=None ,用来给 json.dumps() 传参,所以 要在关键字参数后面拼个字典来传另一组关键字参数 ensure_ascii=False,即:
json_dumps_params={'ensure_ascii':False}