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

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

### 回答1: 可以使用 Python 内置的 `json` 模块来实现。 首先,你需要导入 `json` 模块: ``` import json ``` 然后,你可以使用 `json.dumps()` 函数字典转换JSON 字符串: ``` data = { "name": "John", "age": 30, "city": "New York" } json_str = json.dumps(data, ensure_ascii=False) print(json_str) ``` 输出结果: ``` {"name": "John", "age": 30, "city": "New York"} ``` `json.dumps()` 函数的第二个参数 `ensure_ascii` 用于控制是否以 ASCII 编码输出,如果设置为 `False`,则可以输出文字符。 ### 回答2: Python可以使用内置的json模块将字典格式转化JSON字符串。 首先,导入json模块: ```python import json ``` 然后,定义一个字典对象: ```python data = {'name': 'Alice', 'age': 25, 'city': 'New York'} ``` 接下来,使用json.dumps()方法将字典对象转化JSON字符串: ```python json_string = json.dumps(data) ``` 最后,可以打印输出JSON字符串: ```python print(json_string) ``` 以上代码将输出如下结果: ```python {"name": "Alice", "age": 25, "city": "New York"} ``` 另外,如果想要保留缩进或排序,可以在调用dumps()方法时传入额外的参数。例如,将缩进设置为4个空格: ```python json_string = json.dumps(data, indent=4) ``` 或者按照字母顺序排序键: ```python json_string = json.dumps(data, sort_keys=True) ``` 这样可以得到带有缩进或排序的JSON字符串。 需要注意的是,如果字典的值包含了不支持JSON序列的类型(如函数、类等),则会引发TypeError异常。 ### 回答3: 在Python,可以使用内置的`json`模块将字典对象转换JSON格式的字符串使用`json.dumps()`方法可以将字典转换JSON字符串。 下面是一个示例代码: ```python import json # 创建一个字典对象 person = { "name": "张三", "age": 25, "city": "北京" } # 将字典转换JSON字符串 json_str = json.dumps(person) # 输出JSON字符串 print(json_str) ``` 运行代码后,将会输出以下内容: ```json {"name": "\u5f20\u4e09", "age": 25, "city": "\u5317\u4eac"} ``` 在输出结果,你会看到字典的键和值已经被转换为相应的JSON格式。如果希望输出时文字符正常显示,可以添加`ensure_ascii=False`参数,例如`json_str = json.dumps(person, ensure_ascii=False)`。 需要注意的是,如果字典包含不支持JSON序列的数据类型,如`datetime`对象转换过程将会出错。在这种情况下,可以使用自定义的处理函数或类扩展`JSONEncoder`类来序列这些特殊对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌意随影

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值