django-16.JsonResponse返回中文编码问题

 

前言

django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码

遇到问题

接着前面的User表,测试数据如下

user_name psw mail
yoyo 123456 [email protected]
yoyo2 111111 1
yoyo5 111111 0

接着上一篇【python测试开发django-15.查询结果转json(serializers)】,如果数据库里面有中文的数据,
返回的json数据中文不能正常显示如下,查询的结果中有{"user_name": "\u4e0a\u6d77-\u60a0\u60a0", "psw": "\u5bc6\u7801", "mail": "\u4e2d\u6587"}

{
    "data": [{
        "user_name": "yoyo",
        "psw": "123456", "mail": "[email protected]" }, { "user_name": "yoyo2", "psw": "111111", "mail": "1" }, { "user_name": "yoyo5", "psw": "111111", "mail": "0" }, { "user_name": "\u4e0a\u6d77-\u60a0\u60a0", "psw": "\u5bc6\u7801", "mail": "\u4e2d\u6587" }] }

解决办法

JsonResponse里面有个参数json_dumps_params,设置为json_dumps_params={'ensure_ascii':False}即可

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)   data: 应该传递一个标准的 python 字典给它,它将其转换成 json 格式的数据。   encoder:默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data。关于这个序列化的更多信息参见JSON 序列化。   safe : 默认为True。如果设置为False,可以传递任何对象进行序列化(否则,只允许dict 实例)。如果safe 为True,而第一个参数传递的不是dict 对象,将抛出一个TypeError。 另外:它的默认 Content-Type 头部设置为application/json。   json_dumps_params:在1.9版本中新增,可以传递一个python标准的 json 库中,json.dump() 方法处理后的对象给它,用于生成一个响应。

修改后代码(上一篇的三种方法都适用)

def json_data(request):
    '''values()获取的可迭代dict对象转list''' data = {} ret = User.objects.all().values() data["data"] = list(ret) return JsonResponse(data, safe=False, json_dumps_params={'ensure_ascii':False})

在urls.py配置访问地址 url(r'^json_data$', testdb.json_data,访问后得到的结果(返回的数据自己在线解析过)

{
    "data": [{
        "user_name": "yoyo",
        "psw": "123456", "mail": "[email protected]" }, { "user_name": "yoyo2", "psw": "111111", "mail": "1" }, { "user_name": "yoyo5", "psw": "111111", "mail": "0" }, { "user_name": "上海-悠悠", "psw": "密码", "mail": "中文" }] }

前言

django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码

遇到问题

接着前面的User表,测试数据如下

user_name psw mail
yoyo 123456 [email protected]
yoyo2 111111 1
yoyo5 111111 0

接着上一篇【python测试开发django-15.查询结果转json(serializers)】,如果数据库里面有中文的数据,
返回的json数据中文不能正常显示如下,查询的结果中有{"user_name": "\u4e0a\u6d77-\u60a0\u60a0", "psw": "\u5bc6\u7801", "mail": "\u4e2d\u6587"}

{
    "data": [{
        "user_name": "yoyo",
        "psw": "123456", "mail": "[email protected]" }, { "user_name": "yoyo2", "psw": "111111", "mail": "1" }, { "user_name": "yoyo5", "psw": "111111", "mail": "0" }, { "user_name": "\u4e0a\u6d77-\u60a0\u60a0", "psw": "\u5bc6\u7801", "mail": "\u4e2d\u6587" }] }

解决办法

JsonResponse里面有个参数json_dumps_params,设置为json_dumps_params={'ensure_ascii':False}即可

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)   data: 应该传递一个标准的 python 字典给它,它将其转换成 json 格式的数据。   encoder:默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data。关于这个序列化的更多信息参见JSON 序列化。   safe : 默认为True。如果设置为False,可以传递任何对象进行序列化(否则,只允许dict 实例)。如果safe 为True,而第一个参数传递的不是dict 对象,将抛出一个TypeError。 另外:它的默认 Content-Type 头部设置为application/json。   json_dumps_params:在1.9版本中新增,可以传递一个python标准的 json 库中,json.dump() 方法处理后的对象给它,用于生成一个响应。

修改后代码(上一篇的三种方法都适用)

def json_data(request):
    '''values()获取的可迭代dict对象转list''' data = {} ret = User.objects.all().values() data["data"] = list(ret) return JsonResponse(data, safe=False, json_dumps_params={'ensure_ascii':False})

在urls.py配置访问地址 url(r'^json_data$', testdb.json_data,访问后得到的结果(返回的数据自己在线解析过)

{
    "data": [{
        "user_name": "yoyo",
        "psw": "123456", "mail": "[email protected]" }, { "user_name": "yoyo2", "psw": "111111", "mail": "1" }, { "user_name": "yoyo5", "psw": "111111", "mail": "0" }, { "user_name": "上海-悠悠", "psw": "密码", "mail": "中文" }] }

猜你喜欢

转载自www.cnblogs.com/jason89/p/10359445.html
今日推荐