TypeError:对象在 DJango 1.8 Python 3.4 中不是 JSON 可序列化的

Posted

技术标签:

【中文标题】TypeError:对象在 DJango 1.8 Python 3.4 中不是 JSON 可序列化的【英文标题】:TypeError: object is not JSON serializable in DJango 1.8 Python 3.4 【发布时间】:2015-09-06 08:24:04 【问题描述】:

我正在使用 DJango 1.8 和 Python 3.4

当下面的视图运行时,Django 抛出 Type Error - Object is not JSON Serializable

Views.py

from django.http import HttpRequest,HttpResponse
from django.http import JsonResponse
from json import dumps

def get_stats(request):
    if request.method == "POST":
        srch_dropV = request.POST['srch_dropAJ']
    else:
        srch_dropV = ''
    if(srch_dropV == 'Green'):
        students = GreenBased.objects.all()
    if(srch_dropV == 'Yellow'):
        students = YellowBased.objects.all()
    response_data = 
    try:
        response_data['result'] = 'Success'
        response_data['message'] = list(students)
    except:
        response_data['result'] = 'Ouch!'
        response_data['message'] = 'Script has not ran correctly'
    return HttpResponse(JsonResponse(response_data), content_type="application/json")

我正在尝试从 mysql 数据库中读取几行并将其显示在 html 文件中,当上面的视图正在运行时,我面临下面的错误消息

TypeError: YellowBased: YelloBased object is not JSON serializable

在 HTML 页面中,我有一个下拉列表。根据选择的选项,我的 Ajax 会返回从 mysql 表中获取的记录。

Models.py

class GreenBased(models.Model):
    NumOfStudents = models.CharField(max_length=300,blank=True)
    Green = models.CharField(max_length=300,blank=True)
    class Meta:
        managed = False
        db_table = "GreenStats"

class YelloBased(models.Model):
    NumOfStudents = models.CharField(max_length=300,blank=True)
    Yellow = models.CharField(max_length=300,blank=True)
    class Meta:
        managed = False
        db_table = "YellowStats"

GreenStats 和 YellowStats 表在 mysql 中只包含 2*2 行 有人可以帮我确定这个问题吗?

【问题讨论】:

你检查了吗? ***.com/q/16790375/4724196 我已经检查过了。在 DJango 1.8 中,Json 库已更改,我遗漏了一些东西 :(.. response_data['message'] = list(students) 行在视图中似乎失败了。我正在尝试解决问题,但是还不能解决 抱歉,此行失败 return HttpResponse(JsonResponse(response_data), content_type="application/json") 如果您要交换 JSON 并构建某种 api,我可以建议 django-rest-framework.org 吗?它具有构建 json 视图、高级可定制序列化程序和自动过滤的工具。 【参考方案1】:

你必须序列化你的student对象列表,试试这样:

from django.http import HttpRequest,HttpResponse
from django.http import JsonResponse
from json import dumps
from django.core import serializers


def get_stats(request):
    if request.method == "POST":
        srch_dropV = request.POST['srch_dropAJ']
    else:
        srch_dropV = ''
    if(srch_dropV == 'Green'):
        students = GreenBased.objects.all()
    if(srch_dropV == 'Yellow'):
        students = YellowBased.objects.all()
    response_data = 
    try:
        response_data['result'] = 'Success'
        response_data['message'] = serializers.serialize('json', students)
    except:
        response_data['result'] = 'Ouch!'
        response_data['message'] = 'Script has not ran correctly'
    return JsonResponse(response_data)

注意 :response_data['message'] = serializers.serialize('json', students)

中的行更改

JsonResponse 也可以自己解决问题,因此无需将其包装在 HttpResponse 中。

查看文档以获得更多自定义: https://docs.djangoproject.com/en/1.8/topics/serialization/

希望这会有所帮助!

【讨论】:

以上是关于TypeError:对象在 DJango 1.8 Python 3.4 中不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

Django:'TypeError:'HttpResponseForbidden'对象不可调用

TypeError:无法在 Django 视图函数中解压不可迭代的 int 对象

django:TypeError:'tuple'对象不可调用

Django 预览,TypeError:'str' 对象不可调用

Django - TypeError:“方法”类型的对象没有 len()

TypeError:“TopicSerializer”类型的对象不是 JSON 可序列化的 Django