Python内置的json模块提供了非常完善的对象到JSON格式的转换。废话不多说,我们先看看如何把Python对象变成一个JSON:

d = dict(name='Kaven', age=17, sex='Male')
print(json.dumps(d))  # {"name": "Kaven", "age": 17, "sex": "Male"}

说明:

dumps()方法返回一个str,内容就是标准的JSON。类似的,dump()方法可以直接把JSON写入一个 Object。

要把JSON反序列化为Python对象,我们可以用loads()或者对应的load()方法,前者把JSON的字符串反序列化,后者从Object中读取字符串并反序列化:

比如这样:

import json
json_str = '{"name": "Kaven", "age": 17, "sex": "Male"}'
print(json.loads(json_str)) # {'name': 'Kaven', 'age': 17, 'sex': 'Male'}

Python的dict对象可以直接序列化为JSON的{},那么如何用class对象,比如定义Person类,然后序列化?

dumps 可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Person专门写一个转换函数,再把函数传进去即可:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import jsonclass Person(object):# __slots__ = ('name', 'age') # 通常class的实例都有一个__dict__属性,它就是一个dict,# 用来存储实例变量。也有少数例外,比如定义了__slots__的class,大家可以开启后运行看看报错信息def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexdef PersonToDict(cls):return {'name': cls.name,'age': cls.age,'sex': cls.sex}s = Person('Kaven', 17, 'Male')
print(json.dumps(s, default=PersonToDict))
# print(json.dumps(s, default=lambda obj: obj.__dict__)) 输出和上面一样
# 输出 : {"name": "Kaven", "age": 17, "sex": "Male"}

这样,Person实例首先被PersonToDict()函数转换成dict,然后再被序列化为JSON,大家看到下面有个lambda匿名函数,他的用处可大了,比如:
下次如果遇到一个Apple/Banaba等类的实例,可以把任意class的实例变为dict:

print(json.dumps(s, default=lambda obj: obj.__dict__)) # obj为对象参数名,可自定义

同样的道理,如果我们要把JSON反序列化为一个Person对象实例,loads()方法首先转换出一个dict对象,然后,我们再传入的object_hook函数负责把dict转换为Person实例:

import jsonclass Person(object):# __slots__ = ('name', 'age') # 通常class的实例都有一个__dict__属性,它就是一个dict,# 用来存储实例变量。也有少数例外,比如定义了__slots__的class,大家可以开启后运行看看报错信息def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexdef DictToPerson(d):return Person(d['name'], d['age'], d['sex'])json_str = '{"name": "Kaven", "age": 20, "sex": "Male"}'
cls = json.loads(json_str, object_hook=DictToPerson)
print(cls.name) # Kaven

Python还有个pickle模块,可能存在Python兼容问题,只能用Pickle保存那些不重要的数据。

Python教程:json序列化的方法相关推荐

  1. python 3 json 序列化

    python 3 json 序列化 我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特 ...

  2. python 创建json_使用Django和Python创建Json response的方法

    使用jQuery的.post提交,并期望得到多个数据,Python后台要使用json格式. 不指定datatype为json,让jquery自行判断数据类型.(注:跨域名请求数据,则使用 jsonp字 ...

  3. 黑马程序员python笔记_#华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库...

    [小宅按]在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化. ...

  4. #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库

    在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...

  5. python之json序列化与反序列化

    文章目录 序列化就是将python中的字典转换为一种特殊的字符串(json) 那么反序列化就是,将json字符串转换为python字典 想输出真正的中文需要指定ensure_ascii=False,, ...

  6. python使用json序列化datetime类型问题处理

    使用python的json模块序列化时间或者其他不支持的类型时会抛异常,例如下面的代码: # -*- coding: cp936 -*- from datetime import datetimeim ...

  7. Python使用JSON序列化从入门到精通

    JSON(JavaScript Object Notation)是一个轻量级的数据交换格式,Python标准库json完美实现了该格式,用法类似于marshal和pickle. >>> ...

  8. Python 之 JSON序列化(我不得不说JSON让世界更加美好了)

    文章目录 1.相遇 2.简介 3.序列化和反序列化 1)序列化 2)反序列化 4.使用json深度拷贝 1)第一次尝试 2)第二次尝试 3)第三次尝试,成功! 5.总结 对于开发出JSON的大佬 ,让 ...

  9. 【Python教程】两种方法教你拆分含有多种分隔符的字符串

    方法一:连续使用str.spilt()方法,每次处理一种分隔符: str.split()方法的应用:按某一种分隔符分割字符串: #不能用单词字符进行分割(字母.数字.下划线) A.str.split( ...

最新文章

  1. 【LeetCode】无重复字符的最长子串【滑动窗口法】
  2. Eric Evans说DDD还未结束
  3. 索引与其内部数据结构
  4. AndroidStudio新建项目报错build failed
  5. Android Button常用属性
  6. numpy的sum函数、mean函数
  7. numpy.reshape
  8. Django Rest Framework中文文档:Serializer relations
  9. 注塑车间维修师傅如何快速解决9种注塑机故障?
  10. linux网卡dhcp获取ip,Linux下通过DHCP服务器获取IPv6地址
  11. 900行c语言贪吃蛇,挑战CMD版贪吃蛇,能超过我的分算你赢
  12. 纯css实现icon的网站,代码可复制
  13. 一文搞懂天使轮、A轮、B轮、C轮、D轮融资
  14. Altium designer Sch Compiler:编译常见错误
  15. win10 快速批量删除快速访问下的文件夹记录
  16. 移动端:苹果开发者账号Apple Developer Program
  17. D. Fixed Point Guessing
  18. Day14.网络编程入门及其应用
  19. 升升不息——给电脑升级的人一些建议
  20. ブランドは、同社とその製品、サービス

热门文章

  1. 在电脑上怎么做判断题打√或x_2018电脑知识期末考试【参考答案】
  2. jar中没有主清单属性【解决办法】
  3. 漫谈原生JS添加元素的两种方法
  4. 终于有人说出来了——Java不适合于作为主要编程教学语言
  5. java类名可以是数字吗_在 Java 中,一个类可同时定义许多同名的方法,这些方法的形式参数的个数、类型或顺序各不相同,传回的值也可以不相同。这种面向对象程序特性称为( )。_学小易找答案...
  6. 【无标题】react umi项目在谷歌,火狐,360极速模式打开正常,360兼容模式打开页面空白,报错SCRIPT1002:‘语法错误’,SCRIPT1003: 缺少 ‘:‘
  7. 1.JavaScript中定义数组的两种主要方式
  8. RTKlib相对定位源码解析: ddres函数
  9. OculusQuest使用ALVR无线串流玩SteamVR游戏
  10. 美与科技融合 中国移动发布全新5G手机NZONE 50 Pro