如何使python对象json序列化?

如何使python对象json序列化?,python,mysql,json,django,orm,Python,Mysql,Json,Django,Orm,我想序列化一个python对象,在将它保存到mysql(基于Django ORM)后,我想获取它并将该对象传递给需要此类对象作为参数的函数 以下两部分是我的主要逻辑代码: 1保存参数部分: 类参数(对象): def_uuuinit_uuuu(self,name=None,targeting=None,start_time=None,end_time=None): self.name=名称 自我定位 self.start\u time=开始时间 self.end\u time=结束时间 #...

我想
序列化一个python对象
,在将它保存到
mysql
(基于Django ORM)后,我想获取它并将该对象传递给需要此类对象作为参数的函数

以下两部分是我的主要逻辑代码:

1保存参数部分:


类参数(对象):
def_uuuinit_uuuu(self,name=None,targeting=None,start_time=None,end_time=None):
self.name=名称
自我定位
self.start\u time=开始时间
self.end\u time=结束时间
#...
param=param()
param.name=“name1”
参数targeting=“targeting1”
任务参数={
“任务id”:任务id,字符串
“用户名”:用户名,#字符串
“param”:param,#param对象
“保存参数”:保存参数,字典
“访问令牌”:访问令牌,字符串
“帐户id”:帐户id,字符串
“页面id”:页面id,#字符串
“任务名称”:“同步创建广告”#字符串
}
类SyncTaskList(models.Model):
task_id=models.CharField(最大长度=128,空白=True,空=True)
ad_name=models.CharField(最大长度=128,空白=True,空=True)
user_name=models.CharField(max_length=128,blank=True,null=True)
task_status=models.SmallIntegerField(blank=True,null=True)
task\u fail\u reason=models.CharField(最大长度=255,空白=True,空=True)
task_name=models.CharField(最大长度=128,空白=True,空=True)
开始时间=models.DateTimeField()
end_time=models.DateTimeField(空白=True,空=True)
task_param=models.TextField(blank=True,null=True)
类元:
托管=错误
db_table='sync_task_list'
同步任务列表(
任务id=任务id,
ad_name=param.name,
user\u name=用户名,
任务状态=0,
任务参数=任务参数,
).save()
2.使用参数部件


def add_参数(参数,访问令牌):
通过
任务列表=SyncTaskList.objects.filter(任务状态=0)
对于任务列表中的任务:
task_param=json.loads(task.task_param)
添加参数(任务参数[“参数”]、任务参数[“访问令牌”])#将参数对象传递给函数add#param
如果我直接使用
Django ORM
将task_param保存到mysql中,我会得到错误

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
对于ORM操作之后的字符串,我会将其属性名括在单引号中,如:


# in mysql it saved as 

 task_param: " task_param: {'task_id': 'e4b8b240cefaf58fa9fa5a591221c90a',
              'user_name': 'jimmy',
              'param': Param(name='name1',
                                    targeting='geo_locations',
                                   ),
              'save_param': {}}"


我现在对序列化python对象感到困惑,那么如何加载这个原始对象并将其传递给函数呢

欢迎任何评论。非常感谢

到目前为止更新我的解决方案

任务参数={
# ...
“param”:vars(param),#将param对象转为dictionary
# ...
}
同步任务列表(
#...
task_param=json.dumps(task_param),
#...
).save()
#任务列表=SyncTaskList.objects.filter(任务状态=0)
#对于任务列表中的任务:
task_param=json.loads(task.task_param)
添加参数(参数(**任务参数[“参数”)、任务参数[“访问令牌”])
根据@AJS的答案进行更新

直接
pickle转储
并将其保存为
二进制字段
,然后
pickle加载
它也可以工作


有更好的解决办法吗

基本上,您可以使用Django中的模型字段类型
BinaryField
序列化python对象并将其保存为MySQL数据库中的字节,因为我认为JSON序列化在您的情况下不起作用,因为您的dict中也有一个python对象作为值,当您从db simpily unpickle获取数据时,它的语法类似于json库,请参见下文

import pickle
#to pickle
data = pickle.dumps({'name':'testname'})
# to unpickle just do
pickle.loads(data)
因此,在您的情况下,当您取消pickle对象时,您应该以与pickle之前相同的形式获取数据

希望这有帮助。

尝试查看msgpack

与特定于python的pickle不同,msgpack受多种语言支持(因此用于写入mysql的语言可能不同于用于读取的语言)

还有一些项目将这些序列化程序库集成到Django模型字段中:

  • 泡菜:
  • MsgPack:

如果我在MySql中理解正确,您将任务参数保存为字符串,在列任务参数下,并使用单引号保存。如果我错了,请纠正我使用
json.dumps(obj)
obj
转换为json。它将引发错误
TypeError:type'Param'的对象不是JSON可序列化的
@AJS是的,如果我直接将其保存为上面的代码,它会自动转换为单引号样式
obj
必须是一个简单的Python结构,由内置类型(如字典、列表、字符串、数字)组成。。。你的
param
键不是。谢谢你的回复,在
pickle.dump
之后,我可以得到一个字节的数据,但是当通过
Django-ORM
将其保存到mysql时,它变成了一个字符串,我无法再将其加载回来使用
pickle.dumps
它应该是字符串,你错过了
s