Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 283|回复: 0

[默认分类] 关于Django中JsonResponse返回中文字典编码错误的解决方案

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2020-8-6 11:37:47 | 显示全部楼层 |阅读模式
    解决方案:JsonResponse(data, json_dumps_params={"ensure_ascii":False})
    ! data是需要渲染的字典

    1. def master(request):
    2.     data = {"这是":"主页"}
    3.     return  JsonResponse(data, json_dumps_params={"ensure_ascii":False})
    复制代码


     显示效果: 

    首先我们看JsonResponse()的源码:

    1. class JsonResponse(HttpResponse): 
    2.   def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
    3.     json_dumps_params=None, **kwargs):
    4.     if safe and not isinstance(data, dict):
    5.       raise TypeError(
    6.       "In order to allow non-dict objects to be serialized set the "
    7.       "safe parameter to False."
    8.       )
    9.     if json_dumps_params is None:
    10.       json_dumps_params = {}
    11.     kwargs.setdefault("content_type", "application/json")
    12.      data = json.dumps(data, cls=encoder, **json_dumps_params)
    13.      super(JsonResponse, self).__init__(content=data, **kwargs)
    复制代码


     这里我们从根源开始找它编码错误的原因:
    JsonResponse()在初始化的时候使用了json.dumps()把字典转换成了json格式,具体方法如下:

    1. data = json.dumps(data, cls=encoder, **json_dumps_params)
    复制代码


    接下来我们看看json.dumps()的源码:

    1. def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
    2.         allow_nan=True, cls=None, indent=None, separators=None,
    3.         default=None, sort_keys=False, **kw):
    4.     if (not skipkeys and ensure_ascii and
    5.         check_circular and allow_nan and
    6.         cls is None and indent is None and separators is None and
    7.         default is None and not sort_keys and not kw):
    8.         return _default_encoder.encode(obj)
    9.     if cls is None:
    10.         cls = JSONEncoder
    11.     return cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
    12.         check_circular=check_circular, allow_nan=allow_nan,         
    13.         indent=indent,separators=separators, default=default,
    14.         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并返回响应,前端渲染编码错误的问题。
       
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-30 21:12 , Processed in 0.386094 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表