TypeError:Python对象不是JSON可序列化的
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了TypeError:Python对象不是JSON可序列化的,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3420字,纯文字阅读大概需要5分钟。
内容图文
我试图使用Django中的json.dumps()将对象编码为json,但是当我传入python对象时,它会引发此错误.
TypeError: <OrgInvite: OrgInvite object> is not JSON serializable
我假设即使JSON只能编码某些数据类型,其中一种数据类型就是对象.我在Stack Overflow上读到另一个问题,解决这个问题的一个好方法是使用.__ dict__从对象创建一个字典.我试过这个并且它说我的新字典中的一个键,_state是不可序列化的.我不确定这个_state键是从哪里来的,并且想知道有没有办法将我的对象转换为没有那个额外字段的字典,所以我可以将它编码为JSON?
模型:
class OrgInvite(models.Model):
token = models.CharField(max_length=16, unique=True, null=False)
account_id = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
org_id = models.ForeignKey(Org, on_delete=models.CASCADE, null=False)
used = models.BooleanField(default=False)
is_admin = models.BooleanField(default=False)
name = models.CharField(max_length=70)
email = models.CharField(max_length=255)
视图:
def get_invite(token):
if not token:
raise Exception("Invitation token is not specified")
invitation = OrgInvite.objects.get(token=token)
if not invitation:
raise Exception("Invitation token is invalid.")
return invitation
def invite_accept_redirect(token):
# """ -Redirects to the accept invite frontend view with pre-fetched data. """
try:
invite = get_invite(token)
if not invite:
raise Exception("Invitation token is invalid")
if invite.used:
invite = {'used': True}
except:
invite = {'invalid': True}
raise Exception("Resource not found.")
base = "home/accept"
url = '{}/{}?data={}'.format(base, token, urllib.quote_plus(json.dumps(invite.__dict__)))
return redirect(url)
安慰:
>>> oi = OrgInvite.objects.get(token=100)
>>> oi
<OrgInvite: OrgInvite object>
>>> oix = oi.__dict__
>>> oix
{'used': False, 'name': u'', '_state': <django.db.models.base.ModelState object at 0x10377a610>, 'email': u'', 'token': u'100', 'org_id_id': 101, 'account_id_id': 301, 'is_admin': False, 'id': 1}
>>> json.dumps(oix)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 244, in dumps
return _default_encoder.encode(obj)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <django.db.models.base.ModelState object at 0x10377a610> is not JSON serializable
解决方法:
__dict__给出了实例的所有属性,但是你不想要所有额外的包袱 – 为了序列化,你只对字段感兴趣.
您的模型不包含任何特殊内容,因此内置帮助函数model_to_dict应该足以满足您的需求:
import json
from django.forms.models import model_to_dict
oi = OrgInvite.objects.get(token=100)
oi_dict = model_to_dict(oi)
oi_serialized = json.dumps(oi_dict)
你的例子很简单,只包含CharField,BooleanField和ForeignKey,所有这些都可以简单地转储到json.
对于更复杂的模型,您可以考虑编写自己的serializer.在这种情况下,我建议使用流行的django-rest-framework,它可以为您完成所有工作.
from rest_framework import serializers
class OrgInviteSerializer(serializers.ModelSerializer):
class Meta:
model = OrgInvite
fields = '__all__'
内容总结
以上是互联网集市为您收集整理的TypeError:Python对象不是JSON可序列化的全部内容,希望文章能够帮你解决TypeError:Python对象不是JSON可序列化的所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。