关于Django中JsonResponse返回中文字典编码错误的解决方案
遇到這樣一個(gè)問(wèn)題,返回的json不是中文
def get_json(request):return JsonResponse({"res": "成功"})結(jié)果:
{"res": "\u6210\u529f"}解決方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False})
! data是需要渲染的字典
def get_json(request):return JsonResponse({"res": "成功"},json_dumps_params={'ensure_ascii': False}) {"res": "成功"}原因分析:
首先我們看JsonResponse()的源碼:
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()在初始化的時(shí)候使用了json.dumps()把字典轉(zhuǎn)換成了json格式,具體方法如下: 這里我們從根源開(kāi)始找它編碼錯(cuò)誤的原因:
data?=?json.dumps(data,?cls=encoder,?**json_dumps_params)接下來(lái)我們看看json.dumps()的源碼:
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?andcheck_circular?and?allow_nan?andcls?is?None?and?indent?is?None?and?separators?is?None?anddefault?is?None?and?not?sort_keys?and?not?kw):return?_default_encoder.encode(obj)if?cls?is?None:cls?=?JSONEncoderreturn?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.
?也就是說(shuō)ensure_ascii是false的時(shí)候,可以返回非ASCII碼的值,否則就會(huì)被JSON轉(zhuǎn)義。
所以含有中文的字典轉(zhuǎn)json字符串時(shí),使用?json.dumps() 方法要把ensure_ascii參數(shù)改成false,即?json.dumps(dict,ensure_ascii=False)。
JsonResponse()接收參數(shù)有關(guān)鍵詞參數(shù),json_dumps_params=None?,用來(lái)給?json.dumps() 傳參,所以 要在關(guān)鍵字參數(shù)后面拼個(gè)字典來(lái)傳另一組關(guān)鍵字參數(shù)?ensure_ascii=False,即:
json_dumps_params={'ensure_ascii':False}綜上可解決使用?JsonResponse()?強(qiáng)制把含有中文的字典轉(zhuǎn)json并返回響應(yīng),前端渲染編碼錯(cuò)誤的問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的关于Django中JsonResponse返回中文字典编码错误的解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小案例:搭建简易版王者荣耀英雄购买商城网
- 下一篇: Cygwin中如何像在Ubuntu中一样