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

发布于 2020-10-20  1254 次阅读


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是不支持字典化的也就是:
在这里插入图片描述


繁华落尽,雪花漫天飞舞。