json与序列化pickling
来源:互联网 发布:编程怎么写主程序 编辑:程序博客网 时间:2024/05/22 09:00
JSON:表示出来就是字符串
使用json.dumps(dict)返回一个字符串
json.loads(str)将字符串转化成dict
Python的dict
对象可以直接序列化为JSON的{}
,不过,很多时候,我们更喜欢用class
表示对象,比如定义Student
类,然后序列化:
import
json
class
Student(
object
):
def
__init__(
self
, name, age, score):
self
.name
=
name
self
.age
=
age
self
.score
=
score
def
student2dict(std):
return
{
'name'
: std.name,
'age'
: std.age,
'score'
: std.score
}
def
dict2student(d):
return
Student(d[
'name'
], d[
'age'
], d[
'score'
])
if
__name__
=
=
'__main__'
:
s
=
Student(
'Bob'
,
20
,
88
)
print
(json.dumps(s, default
=
Student.student2dict))
#输出的是字符串类型
json_str
=
'{"age": 20, "score": 88, "name": "Bob"}'
print
(Student.student2dict(json.loads(json_str, object_hook
=
Student.dict2student)))
#输出的是dict类型
别急,我们仔细看看dumps()
方法的参数列表,可以发现,除了第一个必须的obj
参数外,dumps()
方法还提供了一大堆的可选参数:
https://docs.python.org/3/library/json.html#json.dumps
这些可选参数就是让我们来定制JSON序列化。前面的代码之所以无法把Student
类实例序列化为JSON,是因为默认情况下,dumps()
方法不知道如何将Student
实例变为一个JSON的{}
对象。可选参数关键字default
就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student
专门写一个转换函数,再把函数传进去即可:所以我们在类中定义了方法student2dict来完成这个操作。
同样的道理,如果我们要把JSON反序列化为一个Student
对象实例,loads()
方法首先转换出一个dict
对象,然后,我们传入关键字object_hook
的函数负责把dict
转换为Student
实例:函数dict2student就是完成这样一个功能。
json也有dump和load函数,用法同pickling,下面会讲到
pickling:
pickle.dumps()
方法把任意对象序列化成一个bytes
,然后,就可以把这个bytes
写入文件。或者用另一个方法pickle.dump()
直接把对象序列化后写入一个文件:
>>> f
=
open
(
'dump.txt'
,
'wb'
)
>>> pickle.dump(d, f)
>>> f.close()
看看写入的dump.txt
文件,一堆乱七八糟的内容,这些都是Python保存的对象内部信息。
当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes
,然后用pickle.loads()
方法反序列化出对象,也可以直接用pickle.load()
方法从一个file-like Object
中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象:
>>> f
=
open
(
'dump.txt'
,
'rb'
)
>>> d
=
pickle.load(f)
>>> f.close()
>>> d
{
'age'
:
20
,
'score'
:
88
,
'name'
:
'Bob'
}
- json与序列化pickling
- 序列化与json
- JSON解析与序列化
- JSON解析与序列化
- JSON解析与序列化
- JSON--解析与序列化
- json与pickle序列化
- Json序列化 与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- Json序列化与反序列化
- Json序列化与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- JSON序列化 与反序列化
- JSON序列化与反序列化
- JSON序列化与反序列化
- muduo网络库源码解析 三
- 厨房单品
- yii2 中获取 模块、控制器、方法名的方法
- 【Linux 命令操作】Linux中常用操作命令和快捷键
- js jquery 前端 操作大全(常用)
- json与序列化pickling
- H.265和H.264对比分析(VR视频传输)
- MNIST的AlexNet实现
- java中final关键字
- 宏定义实现swap
- Java线程同步:synchronized锁住的是代码还是对象
- 【Python+OpenCV】目标跟踪-卡尔曼滤波-鼠标轨迹跟踪
- 关于jsp表单提交中action所指向Servlet路径问题的总结
- 『ORACLE』RAC删除节点(11g)