解决方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False})

解决方案:JsonResponse(data, json_dumps_params={‘ensure_ascii‘:False})

! data是需要渲染的字典

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}

综上可解决使用 JsonResponse() 强制把含有中文的字典转json并返回响应,前端渲染编码错误的问题。

相关文章