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