关于json.dumps中的参数,例如ensure_ascii


解决方案: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}

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM