使用json库将对象转化为json字符串出错的原因以及解决办法

it2023-10-08  67

1. 在使用json库的dumps()函数将对象JobInfo转换为json字符串返回前端页面的过程中,出现了 导致无法正常将对象JobInfo转换为json对象。这是因为我们自定义的对象 所以需要经过“字典化”将对象的属性转化为 “key”:value的形式一一对应。我们可以使用自定义的格式化方法,也可以直接使用Python提供的字典化函数

obj__dict__

其中obj为我们要格式化的对象。在此次实验过程中obj为一个自定义的JobInfo对象:

class JobInfo: def __init__(self): self.__jobName = "" self.__jobSalary = "" self.__jobCity = "" self.__jobEdu = "" self.__jobExperienceTime = "" self.__jobDes = "" self.__companyName = "" self.__codeName = "" self.__age = "" self.__jobUrl = "" @property def jobSalary(self): return self.__jobSalary @property def codeName(self): return self.__codeName @property def companyName(self): return self.__companyName @property def jobName(self): return self.__jobName @property def jobEdu(self): return self.__jobEdu @property def jobCity(self): return self.__jobCity @property def jobExperienceTime(self): return self.__jobExperienceTime @property def jobDes(self): return self.__jobDes @property def jobUrl(self): return self.__jobUrl @property def age(self): return self.__age def set_jobName(self,jobName): self.__jobName = jobName def set_jobSalary(self,jobSalary): self.__jobSalary = jobSalary def set_jobCity(self,jobCity): self.__jobCity = jobCity def set_jobEdu(self,jobEdu): self.__jobEdu = jobEdu def set_jobExperienceTime(self,jobExperienceTime): self.__jobExperienceTime = jobExperienceTime def set_jobDes(self,jobDes): self.__jobDes = jobDes def set_companyName(self, companyName): self.__companyName = companyName def set_codeName(self, codeName): self.__codeName = codeName def set_age(self, age): self.__age = age def set_jobUrl(self, jobUrl): self.__jobUrl = jobUrl def printJobInfo(self): print("[jobName:"+self.jobName+",jobSalary:"+self.jobSalary+",age:"+self.age+",jobCode:"+self.codeName+",jobCity:"+self.jobCity+",jobEdu:"+self.jobEdu+",jobExperienceTime:"+self.jobExperienceTime+",jobDes:"+self.jobDes+"]")

2解决办法:

​ (1)自定义一个方法将JobInfo对象格式化为json对象格式,使得每个属性都一一对应:

在工具类JsonUti中定义一个静态方法:

@staticmethod def transferObjectToJson(job): """ 将job对象的属性一一与json格式对应 :param job: :return: """ return { "jobSalary": job.jobSalary, "jobCity": job.jobCity, "jobEdu": job.jobEdu, "jobExperienceTime": job.jobExperienceTime, "jobDes": job.jobDes, "jobRequire": job.jobRequire, "codeName": job.codeName, "age": job.age }

经过测试:

from domain.JobInfo import JobInfo from Util.JsonUtil import JsonUtil import json if __name__ == '__main__': job = JobInfo() job.set_age(14) job.set_jobName("张三") job.set_companyName("小米公司") job.set_jobDes("这是一家很好的公司") job.set_codeName("4-5年") job.set_jobCity("武汉") job.set_jobRequire("精通Java") job.set_jobSalary(9000) job.set_jobEdu("本科毕业") jsonStr = json.dumps(job,default=JsonUtil.transferObjectToJson,ensure_ascii=False) print(jsonStr)

发现可以正常转换了。不过目前这个只是支持自定义转换一个对象,而无法转换一个list的对象: 我们使用“字典化”函数快速转换:

from domain.JobInfo import JobInfo import json if __name__ == '__main__': job = JobInfo() job.set_age(14) job.set_jobName("张三") job.set_companyName("小米公司") job.set_jobDes("这是一家很好的公司") job.set_codeName("4-5年") job.set_jobCity("武汉") job.set_jobRequire("精通Java") job.set_jobSalary(9000) job.set_jobEdu("本科毕业") job1 = JobInfo() job1.set_age(14) job1.set_jobName("李四") job1.set_companyName("华为公司") job1.set_jobDes("中国牛逼的大公司") job1.set_codeName("4-5年") job1.set_jobCity("深圳") job1.set_jobRequire("精通C++") job1.set_jobSalary(800000) job1.set_jobEdu("本科毕业") # 使用字典化将对象字典化 str = json.dumps(job1.__dict__,ensure_ascii=False) print(str) list = [] # 逐个将字典化后的对象添加到列表中去 list.append(job1.__dict__) list.append(job.__dict__) list.append(job1) list.append(job) # 将对象列表格式化 jsonStr = json.dumps(list,ensure_ascii=False) print(jsonStr)

测试后发现: 注意事项:必须是先将每个自定义对象先字典化后添加到列表中去,而不是先将对象添加到list后再将list整体字典化。比如:

list = [] list.append(job1) list.append(job) jsonStr = json.dumps(list.__dict__,ensure_ascii=False)

这个用法是错的,因为list是不支持字典化的也就是: 3. 该博客已经同步到个人博客,如有需要请移步:http://moyisuiying.com/index.php/python/288.html

最新回复(0)