使用语句示例:

def  Store(DataStructure, filename):import pickle  #使用pickle模块Fw =open(  filename, ‘w’)pickle.dump(DataStructure, Fw)  #dump函数使用Fw.close()
def  Fetch(  filename ):import pickle  #使用pickle模块Fr =open(  filename)return pickle.load(Fr)

参考链接:http://blog.csdn.net/uestcyao/article/details/7874817

(1):序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上, 很多非游戏程序也会这么干。) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来。这个数据只会被创建它的程序使用,不会发送到网络上,也不会被其它程序读取。因此,互操作的问题被限制在保证新版本的程序能够读取以前版本的程序创建的数据。

在这种情况下,pickle 模块是理想的。它是Python标准库的一部分, 所以它总是可用的。它很快; 它的大部分同Python解释器本身一样是用C写的。 它可以存储任意复杂的Python数据结构。

什么东西能用pickle模块存储?

  • 所有Python支持的 原生类型 : 布尔, 整数, 浮点数, 复数, 字符串, bytes(字节串)对象, 字节数组, 以及 None.

  • 由任何原生类型组成的列表,元组,字典和集合。

  • 由任何原生类型组成的列表,元组,字典和集合组成的列表,元组,字典和集合(可以一直嵌套下去,直至Python支持的最大递归层数).

  • 函数,类,和类的实例(带警告)。

(2):源码实例:

def storeSP(obj, filename):import pickle as pkfw = open(filename,'w')protocol = fwpk.dump(obj,  protocol)def fetchSP(filename):import pickle as pkfr =open(filename)return pk.load(fr)

(3):序列化python对象被其他语言读取:

    pickle模块使用的数据格式是Python特定的。它没有做任何兼容其它编程语言的努力。如果跨语言兼容是你的需求之一,你得去寻找其它的序列化格式。一个这样的格式是json。 “json” 代表 “JavaScript Object Notation,” 但是不要让名字糊弄你。 — json 是被设计为跨语言使用的。

Python 3 在标准库中包含了一个 json模块。同 pickle模块类似, json模块包含一些函数,可以序列化数据结构,保存序列化后的数据至磁盘,从磁盘上读取序列化后的数据,将数据反序列化成新的Pythone对象。但两者也有一些很重要的区别。 首先, json数据格式是基于文本的, 不是二进制的。RFC 4627 定义了json格式以及怎样将各种类型的数据编码成文本。比如,一个布尔值要么存储为5个字符的字符串'false',要么存储为4个字符的字符串 'true'。 所有的json值都是大小写敏感的。

第二,由于是文本格式, 存在空白(whitespaces)的问题。 json 允许在值之间有任意数目的空白(空格, 跳格, 回车,换行)。空白是“无关紧要的”,这意味着json编码器可以按它们的喜好添加任意多或任意少的空白, 而json解码器被要求忽略值之间的任意空白。这允许你“美观的打印(pretty-print)” 你的 json 数据, 通过不同的缩进层次嵌套值,这样你就可以在标准浏览器或文本编辑器中阅读它。Python 的 json 模块有在编码时执行美观打印(pretty-printing)的选项。

第三, 字符编码的问题是长期存在的。json 用纯文本编码数据, 但是你知道,“不存在纯文本这种东西。” json必须以Unicode 编码(UTF-32, UTF-16, 或者默认的, utf-8)方式存储,RFC 4627的第3节 定义了如何区分使用的是哪种编码。

将数据保存至 json 文件#

json 看起来非常像你在Javascript中手工定义的数据结构。这不是意外; 实际上你可以使用JavaScript 的eval()函数来“解码” json序列化过的数据。(通常的对非信任输入的警告也适用, 但关键点是json  合法的JavaScript。) 因此, 你可能已经熟悉json了。

>>> shell 1
>>> basic_entry = {} ①
>>> basic_entry['id'] = 256
>>> basic_entry['title'] = 'Dive into history, 2009 edition'
>>> basic_entry['tags'] = ('diveintopython', 'docbook', 'html')
>>> basic_entry['published'] = True
>>> basic_entry['comments_link'] = None
>>> import json
>>> with open('basic.json', mode='w', encoding='utf-8') as f: ②...     json.dump(basic_entry, f) ③
我们将创建一个新的数据结构,而不是重用现存的entry数据结构。在这章的后面, 我们将会看见当我们试图用json编码更复杂的数据结构的时候会发生什么。
json 是一个基于文本的格式, 这意味你可以以文本模式打开文件,并给定一个字符编码。用utf-8总是没错的。
pickle模块一样, json 模块定义了dump()函数,它接受一个Python 数据结构和一个可写的流对象。dump() 函数将Python数据结构序列化并写入到流对象中。在with语句内工作保证当我们完成的时候正确的关闭文件。

那么生成的json序列化数据是什么样的呢?

<div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">you@localhost:~/diveintopython3/examples$ </samp><kbd style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154">cat basic.json</kbd>
<samp style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important">{"published": true, "tags": ["diveintopython", "docbook", "html"], "comments_link": null,
"id": 256, "title": "Dive into history, 2009 edition"}</samp></div>

这肯定比pickle 文件更可读。然而 json 的值之间可以包含任意数目的空把, 并且json模块提供了一个方便的途径来利用这一点生成更可读的json文件。

>>>shell1
 >>>with open('basic-pretty.json', mode='w', encoding='utf-8')as f:
 ...    json.dump(basic_entry, f,indent=2)①
如果你给json.dump()函数传入indent参数, 它以文件变大为代价使生成的json文件更可读。indent 参数是一个整数。0 意味着“每个值单独一行。” 大于0的数字意味着“每个值单独一行并且使用这个数目的空格来缩进嵌套的数据结构。”

这是结果:

<div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">you@localhost:~/diveintopython3/examples$ </samp><kbd style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154">cat basic-pretty.json</kbd>
<samp style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important">{"published": true, "tags": ["diveintopython", "docbook", "html"], "comments_link": null, "id": 256, "title": "Dive into history, 2009 edition"
}</samp></div>

将Python数据类型映射到json#

由于json 不是Python特定的,对应到Python的数据类型的时候有很多不匹配。有一些仅仅是名字不同,但是有两个Python数据类型完全缺少。看看你能能把它们指出来:

笔记 JSON Python 3
  object dictionary
  array list
  string string
  integer integer
  real number float
* true True
* false False
* null None
* 所有的 json 值都是大小写敏感的。

注意到什么被遗漏了吗?元组和 & 字节串(bytes)! json 有数组类型, json 模块将其映射到Python的列表, 但是它没有一个单独的类型对应 “冻结数组(frozen arrays)” (元组)。而且尽管 json 非常好的支持字符串,但是它没有对bytes 对象或字节数组的支持。

序列化json不支持的数据类型#

即使json没有内建的字节流支持, 并不意味着你不能序列化bytes对象。json模块提供了编解码未知数据类型的扩展接口。(“未知”的意思是≴json没有定义”。很显然json 模块认识字节数组, 但是它被json规范的限制束缚住了。) 如果你希望编码字节串或者其它json没有原生支持的数据类型,你需要给这些类型提供定制的编码和解码器。

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">shell</span></kbd>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="lit" style="color:#06666;line-height:2.154;">1</span></samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry</span></kbd>                                                 <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">①</span></a>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="pun" style="color:#66660;line-height:2.154;">{</span><span class="str" style="color:#0880;line-height:2.154;">'comments_link'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">None</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'internal_id'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> b</span><span class="str" style="color:#0880;line-height:2.154;">'\xDE\xD5\xB4\xF8'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'title'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'Dive into history, 2009 edition'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'tags'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'diveintopython'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'docbook'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'html'</span><span class="pun" style="color:#66660;line-height:2.154;">),</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'article_link'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'published_date'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> time</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">struct_time</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">tm_year</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">2009</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_mon</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">3</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_mday</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">27</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_hour</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">22</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_min</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">20</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_sec</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">42</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_wday</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">4</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_yday</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">86</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_isdst</span><span class="pun" style="color:#66660;line-height:2.154;">=-</span><span class="lit" style="color:#06666;line-height:2.154;">1</span><span class="pun" style="color:#66660;line-height:2.154;">),</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'published'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">True</span><span class="pun" style="color:#66660;line-height:2.154;">}</span></samp>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">import</span><span class="pln" style="color:#000000;line-height:2.154;"> json</span></kbd>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">with</span><span class="pln" style="color:#000000;line-height:2.154;"> open</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'entry.json'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'w'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> encoding</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="str" style="color:#0880;line-height:2.154;">'utf-8'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">as</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">:</span></kbd>  <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">②</span></a>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">    json</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="kwd" style="color:#0088;line-height:2.154;">dump</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">entry</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></kbd>                               <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">③</span></a>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp>
<samp class="traceback" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(136,0,0)">Traceback (most recent call last):File "<stdin>", line 5, in <module>File "C:\Python31\lib\json\__init__.py", line 178, in dumpfor chunk in iterable:File "C:\Python31\lib\json\encoder.py", line 408, in _iterencodefor chunk in _iterencode_dict(o, _current_indent_level):File "C:\Python31\lib\json\encoder.py", line 382, in _iterencode_dictfor chunk in chunks:File "C:\Python31\lib\json\encoder.py", line 416, in _iterencodeo = _default(o)File "C:\Python31\lib\json\encoder.py", line 170, in defaultraise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'\xDE\xD5\xB4\xF8' is not JSON serializable</samp></div>
好的, 是时间再看看entry 数据结构了。它包含了所有的东西: 布尔值,None值,字符串,字符串元组, bytes对象, 以及time结构体。
我知道我已经说过了,但是这值得再重复一次:json 是一个基于文本的格式。总是应使用utf-8字符编码以文本模式打开json文件。
嗯,可不好。发生什么了?

情况是这样的: json.dump() 函数试图序列化bytes对象 b'\xDE\xD5\xB4\xF8',但是它失败了,原因是json 不支持bytes对象。然而, 如果保存字节串对你来说很重要,你可以定义自己的“迷你序列化格式。”

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/examples/customserializer.py" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">download <code style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; word-spacing:0px">customserializer.py</code></a>]
</div><div class="b" style="line-height:2.154; clear:left"><code style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="kwd" style="color:#0088;line-height:2.154;">def</span><span class="pln" style="color:#000000;line-height:2.154;"> to_json</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">python_object</span><span class="pun" style="color:#66660;line-height:2.154;">):</span><span class="pln" style="color:#000000;line-height:2.154;">                                             </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">①</span></span></a><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="pln" style="color:#000000;line-height:2.154;">    </span><span class="kwd" style="color:#0088;line-height:2.154;">if</span><span class="pln" style="color:#000000;line-height:2.154;"> isinstance</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">python_object</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> bytes</span><span class="pun" style="color:#66660;line-height:2.154;">):</span><span class="pln" style="color:#000000;line-height:2.154;">                                </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">②</span></span></a><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="pln" style="color:#000000;line-height:2.154;">        </span><span class="kwd" style="color:#0088;line-height:2.154;">return</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">{</span><span class="str" style="color:#0880;line-height:2.154;">'__class__'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'bytes'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'__value__'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> list</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">python_object</span><span class="pun" style="color:#66660;line-height:2.154;">)}</span><span class="pln" style="color:#000000;line-height:2.154;">                       </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">③</span></span></a><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="pln" style="color:#000000;line-height:2.154;">    </span><span class="kwd" style="color:#0088;line-height:2.154;">raise</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="typ" style="color:#66066;line-height:2.154;">TypeError</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">repr</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">python_object</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">+</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">' is not JSON serializable'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;">  </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">④</span></span></a></code></div>
为了给一个json没有原生支持的数据类型定义你自己的“迷你序列化格式”, 只要定义一个接受一个Python对象为参数的函数。这个对象将会是json.dump()函数无法自己序列化的实际对象 — 这个例子里是bytes 对象 b'\xDE\xD5\xB4\xF8'
你的自定义序列化函数应该检查json.dump()函数传给它的对象的类型。当你的函数只序列化一个类型的时候这不是必须的,但是它使你的函数的覆盖的内容清楚明白,并且在你需要序列化更多类型的时候更容易扩展。
在这个例子里面, 我将bytes 对象转换成字典。__class__ 键持有原始的数据类型(以字符串的形式, 'bytes'), 而 __value__ 键持有实际的数据。当然它不能是bytes对象; 大体的想法是将其转换成某些可以被json序列化的东西! bytes对象就是一个范围在0–255的整数的序列。 我们可以使用list() 函数将bytes对象转换成整数列表。所以b'\xDE\xD5\xB4\xF8' 变成 [222, 213, 180, 248]. (算一下! 这是对的! 16进制的字节 \xDE 是十进制的 222, \xD5 是 213, 以此类推。)
这一行很重要。你序列化的数据结构可能包含json内建的可序列化类型和你的定制序列化器支持的类型之外的东西。在这种情况下,你的定制序列化器抛出一个TypeError,那样json.dump() 函数就可以知道你的定制序列化函数不认识该类型。

就这么多;你不需要其它的东西。特别是, 这个定制序列化函数返回Python字典,不是字符串。你不是自己做所有序列化到json的工作; 你仅仅在做转换成被支持的类型那部分工作。json.dump() 函数做剩下的事情。

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">shell</span></kbd>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="lit" style="color:#06666;line-height:2.154;">1</span></samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">import</span><span class="pln" style="color:#000000;line-height:2.154;"> customserializer</span></kbd>                                                             <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">①</span></a>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">with</span><span class="pln" style="color:#000000;line-height:2.154;"> open</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'entry.json'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'w'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> encoding</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="str" style="color:#0880;line-height:2.154;">'utf-8'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">as</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">:</span></kbd>                                <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">②</span></a>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">    json</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="kwd" style="color:#0088;line-height:2.154;">dump</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">entry</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;font-weight:normal; line-height:2.154;">default</span><span class="pun" style="color:#66660;font-weight:normal; line-height:2.154;">=</span><span class="pln" style="font-weight:normal; line-height:2.154">customserializer</span><span class="pun" style="color:#66660;font-weight:normal; line-height:2.154;">.</span><span class="pln" style="font-weight:normal; line-height:2.154">to_json</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></kbd>                           <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">③</span></a>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp>
<samp class="traceback" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(136,0,0)">Traceback (most recent call last):File "<stdin>", line 9, in <module>json.dump(entry, f, default=customserializer.to_json)File "C:\Python31\lib\json\__init__.py", line 178, in dumpfor chunk in iterable:File "C:\Python31\lib\json\encoder.py", line 408, in _iterencodefor chunk in _iterencode_dict(o, _current_indent_level):File "C:\Python31\lib\json\encoder.py", line 382, in _iterencode_dictfor chunk in chunks:File "C:\Python31\lib\json\encoder.py", line 416, in _iterencodeo = _default(o)File "/Users/pilgrim/diveintopython3/examples/customserializer.py", line 12, in to_json
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial">    raise TypeError(repr(python_object) + ' is not JSON serializable')                     <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;color:#222222;line-height:1.75;">④</span></a>
TypeError: time.struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22, tm_min=20, tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1) is not JSON serializable</samp></div>
customserializer 模块是你在前一个例子中定义to_json()函数的地方。
文本模式, utf-8 编码, yadda yadda。(你很可能会忘记这一点! 我就忘记过好几次! 事情一切正常直到它失败的时刻, 而它的失败很令人瞩目。)
这是重点: 为了将定制转换函数钩子嵌入json.dump()函数, 只要将你的函数以default参数传入json.dump()函数。(万岁, Python里一切皆对象!)
好吧, 实际上还是不能工作。但是看一下异常。json.dump() 函数不再抱怨无法序列化bytes对象了。现在它在抱怨另一个完全不同的对象: time.struct_time 对象。

尽管得到另一个不同的异常看起来不是什么进步, 但它确实是个进步! 再调整一下就可以解决这个问题。

import time def to_json(python_object):

<div class="b" style="line-height:2.154; clear:left"><code style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"></code><pre name="code" class="python">if isinstance(python_object, time.struct_time):          ①
return {'__class__': 'time.asctime',                '__value__': time.asctime(python_object)}    ②    if isinstance(python_object, bytes):        return {'__class__': 'bytes',                '__value__': list(python_object)
}    raise TypeError(repr(python_object) + ' is not JSON serializable')
在现存的customserializer.to_json()函数里面, 我们加入了Python 对象 (json.dump() 处理不了的那些) 是不是 time.struct_time的判断。
如果是的,我们做一些同处理bytes对象时类似的事情来转换: 将time.struct_time 结构转化成一个只包含json可序列化值的字典。在这个例子里, 最简单的将日期时间转换成json可序列化值的方法是使用time.asctime()函数将其转换成字符串。time.asctime() 函数将难看的time.struct_time 转换成字符串 'Fri Mar 27 22:20:42 2009'

有了两个定制的转换, 整个entry 数据结构序列化到json应该没有进一步的问题了。

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">shell</span></kbd>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="lit" style="color:#06666;line-height:2.154;">1</span></samp>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">with</span><span class="pln" style="color:#000000;line-height:2.154;"> open</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'entry.json'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'w'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> encoding</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="str" style="color:#0880;line-height:2.154;">'utf-8'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">as</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">:</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">    json</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="kwd" style="color:#0088;line-height:2.154;">dump</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">entry</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">default</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="pln" style="color:#000000;line-height:2.154;">customserializer</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">to_json</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp></div>

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">you@localhost:~/diveintopython3/examples$ </samp><kbd style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154">ls -l example.json</kbd>
<samp style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important">-rw-r--r-- 1 you  you  391 Aug  3 13:34 entry.json</samp>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">you@localhost:~/diveintopython3/examples$ </samp><kbd style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154">cat example.json</kbd>
<samp style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important">{"published_date": {"__class__": "time.asctime", "__value__": "Fri Mar 27 22:20:42 2009"},
"comments_link": null, "internal_id": {"__class__": "bytes", "__value__": [222, 213, 180, 248]},
"tags": ["diveintopython", "docbook", "html"], "title": "Dive into history, 2009 edition",
"article_link": "http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition",
"published": true}</samp></div>

从json文件加载数据#

类似pickle 模块,json模块有一个load()函数接受一个流对象,从中读取 json编码过的数据, 并且创建该json数据结构的Python对象的镜像。

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">shell</span></kbd>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="lit" style="color:#06666;line-height:2.154;">2</span></samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">del</span><span class="pln" style="color:#000000;line-height:2.154;"> entry</span></kbd>                                             <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">①</span></a>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry</span></kbd>
<samp class="traceback" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(136,0,0)">Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'entry' is not defined</samp>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">import</span><span class="pln" style="color:#000000;line-height:2.154;"> json</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">with</span><span class="pln" style="color:#000000;line-height:2.154;"> open</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'entry.json'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'r'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> encoding</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="str" style="color:#0880;line-height:2.154;">'utf-8'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">as</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">:</span></kbd>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">    entry </span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="pln" style="color:#000000;line-height:2.154;"> json</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">load</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">f</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></kbd>                              <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">②</span></a>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry</span></kbd>                                                 <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">③</span></a>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="pun" style="color:#66660;line-height:2.154;">{</span><span class="str" style="color:#0880;line-height:2.154;">'comments_link'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">None</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'internal_id'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">{</span><span class="str" style="color:#0880;line-height:2.154;">'__class__'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'bytes'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'__value__'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="lit" style="color:#06666;line-height:2.154;">222</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="lit" style="color:#06666;line-height:2.154;">213</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="lit" style="color:#06666;line-height:2.154;">180</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="lit" style="color:#06666;line-height:2.154;">248</span><span class="pun" style="color:#66660;line-height:2.154;">]},</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'title'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'Dive into history, 2009 edition'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'tags'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'diveintopython'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'docbook'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'html'</span><span class="pun" style="color:#66660;line-height:2.154;">],</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'article_link'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'published_date'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">{</span><span class="str" style="color:#0880;line-height:2.154;">'__class__'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'time.asctime'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'__value__'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'Fri Mar 27 22:20:42 2009'</span><span class="pun" style="color:#66660;line-height:2.154;">},</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'published'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">True</span><span class="pun" style="color:#66660;line-height:2.154;">}</span></samp></div>
为了演示目的,切换到Python Shell #2 并且删除在这一章前面使用pickle模块创建的entry数据结构。
最简单的情况下,json.load()函数同pickle.load()函数的结果一模一样。你传入一个流对象,它返回一个新的Python对象。
有好消息也有坏消息。好消息先来: json.load() 函数成功的读取了你在Python Shell #1中创建的entry.json文件并且生成了一个包含那些数据的新的Python对象。接着是坏消息: 它没有重建原始的 entry 数据结构。'internal_id' 和 'published_date' 这两个值被重建为字典 — 具体来说, 你在to_json()转换函数中使用json兼容的值创建的字典。

json.load() 并不知道你可能传给json.dump()的任何转换函数的任何信息。你需要的是to_json()函数的逆函数 — 一个接受定制转换出的json 对象并将其转换回原始的Python数据类型。

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><code style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="com" style="color:#8800;line-height:2.154;"># add this to customserializer.py</span><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="kwd" style="color:#0088;line-height:2.154;">def</span><span class="pln" style="color:#000000;line-height:2.154;"> from_json</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">json_object</span><span class="pun" style="color:#66660;line-height:2.154;">):</span><span class="pln" style="color:#000000;line-height:2.154;">                                   </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">①</span></span></a><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="pln" style="color:#000000;line-height:2.154;">    </span><span class="kwd" style="color:#0088;line-height:2.154;">if</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'__class__'</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">in</span><span class="pln" style="color:#000000;line-height:2.154;"> json_object</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;">                            </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">②</span></span></a><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="kwd" style="color:#0088;line-height:2.154;">if</span><span class="pln" style="color:#000000;line-height:2.154;"> json_object</span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'__class__'</span><span class="pun" style="color:#66660;line-height:2.154;">]</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">==</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'time.asctime'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="pln" style="color:#000000;line-height:2.154;">            </span><span class="kwd" style="color:#0088;line-height:2.154;">return</span><span class="pln" style="color:#000000;line-height:2.154;"> time</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">strptime</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">json_object</span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'__value__'</span><span class="pun" style="color:#66660;line-height:2.154;">])</span><span class="pln" style="color:#000000;line-height:2.154;">    </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">③</span></span></a><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="kwd" style="color:#0088;line-height:2.154;">if</span><span class="pln" style="color:#000000;line-height:2.154;"> json_object</span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'__class__'</span><span class="pun" style="color:#66660;line-height:2.154;">]</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">==</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'bytes'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;">
</span><a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><span class="pln" style="color:#000000;line-height:2.154;">            </span><span class="kwd" style="color:#0088;line-height:2.154;">return</span><span class="pln" style="color:#000000;line-height:2.154;"> bytes</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">json_object</span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'__value__'</span><span class="pun" style="color:#66660;line-height:2.154;">])</span><span class="pln" style="color:#000000;line-height:2.154;">            </span><span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75"><span class="pun" style="line-height:1.75">④</span></span></a><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="kwd" style="color:#0088;line-height:2.154;">return</span><span class="pln" style="color:#000000;line-height:2.154;"> json_object</span></code></div>
这函数也同样接受一个参数返回一个值。但是参数不是字符串,而是一个Python对象 — 反序列化一个json编码的字符串为Python的结果。
你只需要检查这个对象是否包含to_json()函数创建的'__class__'键。如果是的,'__class__'键对应的值将告诉你如何将值解码成原来的Python数据类型。
为了解码由time.asctime()函数返回的字符串,你要使用time.strptime()函数。这个函数接受一个格式化过的时间字符串(格式可以自定义,但默认值同time.asctime()函数的默认值相同) 并且返回time.struct_time.
为了将整数列表转换回bytes 对象, 你可以使用 bytes() 函数。

就是这样; to_json()函数处理了两种数据类型,现在这两个数据类型也在from_json()函数里面处理了。下面是结果:

跳过该代码清单

<div class="w" style="float:left">[<a target=_blank target="_blank" class="toggle" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">隐藏</a>] [<a target=_blank target="_blank" href="http://woodpecker.org.cn/diveintopython3/serializing.html" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; font-family:'Gill Sans','Gill Sans MT',Corbel,Helvetica,'Nimbus Sans L',sans-serif; line-height:2.154; word-spacing:0.1em; color:rgb(180,69,130); border-style:initial; border-color:initial">在新窗口中打开</a>]</div><div class="b" style="line-height:2.154; clear:left"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">shell</span></kbd>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="lit" style="color:#06666;line-height:2.154;">2</span></samp>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">import</span><span class="pln" style="color:#000000;line-height:2.154;"> customserializer</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">with</span><span class="pln" style="color:#000000;line-height:2.154;"> open</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'entry.json'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'r'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> encoding</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="str" style="color:#0880;line-height:2.154;">'utf-8'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">as</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">:</span></kbd>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">    entry </span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="pln" style="color:#000000;line-height:2.154;"> json</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">load</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">f</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> object_hook</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="pln" style="color:#000000;line-height:2.154;">customserializer</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">from_json</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></kbd>  <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">①</span></a>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry</span></kbd>                                                             <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">②</span></a>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="pun" style="color:#66660;line-height:2.154;">{</span><span class="str" style="color:#0880;line-height:2.154;">'comments_link'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">None</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'internal_id'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> b</span><span class="str" style="color:#0880;line-height:2.154;">'\xDE\xD5\xB4\xF8'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'title'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'Dive into history, 2009 edition'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'tags'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'diveintopython'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'docbook'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'html'</span><span class="pun" style="color:#66660;line-height:2.154;">],</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'article_link'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'published_date'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> time</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">struct_time</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">tm_year</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">2009</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_mon</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">3</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_mday</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">27</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_hour</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">22</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_min</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">20</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_sec</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">42</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_wday</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">4</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_yday</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="lit" style="color:#06666;line-height:2.154;">86</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> tm_isdst</span><span class="pun" style="color:#66660;line-height:2.154;">=-</span><span class="lit" style="color:#06666;line-height:2.154;">1</span><span class="pun" style="color:#66660;line-height:2.154;">),</span><span class="pln" style="color:#000000;line-height:2.154;"></span><span class="str" style="color:#0880;line-height:2.154;">'published'</span><span class="pun" style="color:#66660;line-height:2.154;">:</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">True</span><span class="pun" style="color:#66660;line-height:2.154;">}</span></samp></div>
为了将from_json()函数嵌入到反序列化过程中,把它作为object_hook 参数传入到json.load()函数中。接受函数作为参数的函数; 真方便!
entry 数据结构现在有一个值为bytes对象的'internal_id'键。它也包含一个'published_date'键,其值为time.struct_time对象。

然而,还有最后一个缺陷。

跳过该代码清

<div class="b" style="line-height:2.154; clear:left">
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">import</span><span class="pln" style="color:#000000;line-height:2.154;"> customserializer</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="kwd" style="color:#0088;line-height:2.154;">with</span><span class="pln" style="color:#000000;line-height:2.154;"> open</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'entry.json'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'r'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> encoding</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="str" style="color:#0880;line-height:2.154;">'utf-8'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="kwd" style="color:#0088;line-height:2.154;">as</span><span class="pln" style="color:#000000;line-height:2.154;"> f</span><span class="pun" style="color:#66660;line-height:2.154;">:</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">    entry2 </span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="pln" style="color:#000000;line-height:2.154;"> json</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">load</span><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="pln" style="color:#000000;line-height:2.154;">f</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> object_hook</span><span class="pun" style="color:#66660;line-height:2.154;">=</span><span class="pln" style="color:#000000;line-height:2.154;">customserializer</span><span class="pun" style="color:#66660;line-height:2.154;">.</span><span class="pln" style="color:#000000;line-height:2.154;">from_json</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></kbd>
<samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">... </samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry2 </span><span class="pun" style="color:#66660;line-height:2.154;">==</span><span class="pln" style="color:#000000;line-height:2.154;"> entry</span></kbd>                                                    <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">①</span></a>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="kwd" style="color:#0088;line-height:2.154;">False</span></samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry</span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'tags'</span><span class="pun" style="color:#66660;line-height:2.154;">]</span></kbd>                                                      <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">②</span></a>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="pun" style="color:#66660;line-height:2.154;">(</span><span class="str" style="color:#0880;line-height:2.154;">'diveintopython'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'docbook'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'html'</span><span class="pun" style="color:#66660;line-height:2.154;">)</span></samp>
<a target=_blank target="_blank" style="border-bottom-width:0px; padding-top:0.4375em; padding-right:0px; padding-bottom:0.4375em; padding-left:0px; border-top-width:0px; border-right-width:0px; border-left-width:0px; border-style:initial; border-color:initial"><samp class="p" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important; color:rgb(102,102,119)">>>> </samp><kbd class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:2.154"><span class="pln" style="color:#000000;line-height:2.154;">entry2</span><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'tags'</span><span class="pun" style="color:#66660;line-height:2.154;">]</span></kbd>                                                     <span class="u" style="font-family:'Arial Unicode MS','DejaVu Sans',FreeSerif,OpenSymbol,sans-serif;font-size:14px;line-height:1.75">③</span></a>
<samp class="pp" style="font-family:Consolas,'Andale Mono',Monaco,'Liberation Mono','Bitstream Vera Sans Mono','DejaVu Sans Mono',monospace; line-height:inherit!important"><span class="pun" style="color:#66660;line-height:2.154;">[</span><span class="str" style="color:#0880;line-height:2.154;">'diveintopython'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'docbook'</span><span class="pun" style="color:#66660;line-height:2.154;">,</span><span class="pln" style="color:#000000;line-height:2.154;"> </span><span class="str" style="color:#0880;line-height:2.154;">'html'</span><span class="pun" style="color:#66660;line-height:2.154;">]</span></samp></div>
即使在序列化过程中加入了to_json()钩子函数, 也在反序列化过程中加入from_json()钩子函数, 我们仍然没有重新创建原始数据结构的完美复制品。为什么没有?
在原始的entry 数据结构中, 'tags'键的值为一个三个字符串组成的元组。
但是重现创建的entry2 数据结构中, 'tags' 键的值是一个三个字符串组成的列表json 并不区分元组和列表;它只有一个类似列表的数据类型,数组,并且json模块在序列化过程中会安静的将元组和列表两个都转换成json 数组。大多数情况下,你可以忽略元组和列表的区别,但是在使用json 模块时应记得有这么一回使。

扩展阅读:

很多关于pickle模块的文章提到了cPickle。在Python 2中, pickle 模块有两个实现, 一个由纯Python写的而另一个用C写的(但仍然可以在Python中调用)。在Python 3中, 这两个模块已经合并, 所以你总是简单的import pickle就可以。你可能会发现这些文章很有用,但是你应该忽略已过时的关于的cPickle的信息.

使用pickle模块打包:

  • pickle module
  • pickle and cPickle — Python object serialization
  • Using pickle
  • Python persistence management

使用json 和 json 模块:

  • json — JavaScript Object Notation Serializer
  • JSON encoding and ecoding with custom objects in Python

扩展打包:

  • Pickling class instances
  • Persistence of external objects
  • Handling stateful objects

Python序列化的使用(有少量修改)相关推荐

  1. python序列化和反序列化ppt_老生常谈Python序列化和反序列化

    通过将对象序列化可以将其存储在变量或者文件中,可以保存当时对象的状态,实现其生命周期的延长.并且需要时可以再次将这个对象读取出来.Python中有几个常用模块可实现这一功能. pickle模块 存储在 ...

  2. Python 序列化 pickle/cPickle模块

    Python 序列化 pickle/cPickle模块 2013-10-17 Posted by yeho Python序列化的概念很简单.内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给 ...

  3. python序列化持久化需要注意的一个问题

    python序列化一个对象的时候如果需要写入文件,一定要记得打开方式需要增加b选项否则fwrite会默认以为是要进行String的写入而失败. 同样读取文件的时候也需要加入b选项以示binary 转载 ...

  4. python登录交换机执行命令_如何用Python脚本登录到交换机上修改配置?

    原标题:如何用Python脚本登录到交换机上修改配置? 网 工 圈 网络工程师阿龙 圈内最早的公益公众号,本号已认证!学网络关注我一个就够了(关注近5w+) 关注 听说 99%的 网工都来这里充电吖 ...

  5. python configure函数 循环_使用python统计git仓库中频繁修改的热点函数

    本篇博客以开源代码RT-Thread为例,描述了如何使用python扫描统计代码中频繁修改的函数,帮助我们发现系统中需求变化和BUG制造的重灾区. 需求背景 最近在学习设计模式时,印象深刻的一句话就是 ...

  6. python字典键盘添加元素_对python字典元素的添加与修改方法详解

    1.字典中的键存在时,可以通过字典名+下标的方式访问字典中改键对应的值,若键不存在则会抛出异常.如果想直接向字典中添加元素可以直接用字典名+下标+值的方式添加字典元素,只写键想后期对键赋值这种方式会抛 ...

  7. 【Python茴香豆系列】之 PANDAS 修改 DataFrame 列名

    [Python茴香豆系列]之 PANDAS 修改 DataFrame 列名 用 Python 编程,使用不同的方法来完成同一个目标,有时候是一件很有意思的事情.这让我想起鲁迅笔下的孔乙己.孔乙己对于茴 ...

  8. 利用python获取word图表数据和修改图表信息

    利用python获取word图表数据和修改图表信息 起因咸鱼有个人问word怎么修改图表信息,想用docx库找不到关于图表的方法,这里用了Win32com. import time import wi ...

  9. 随笔——自己制作python编译器——pip.exe的复制修改

    目录 前言 了解pip 使用: 改编pip 前言 我再仿制python编译器(IDLE)时需要改编pip.exe,然后就有了这篇博客. 了解pip (上传pypi再pip下载后期我会出教程讲) pip ...

最新文章

  1. Vue+ElementUI+SpringMVC实现图片上传和回显
  2. 函数作用域,闭包,数据类型的题目
  3. pom.xml详细说明
  4. spring datasource oracle,spring中2种oracle数据源的配置
  5. C#:winform开发的System.AccessViolationException错误,已解决
  6. libpcap 库使用(二)
  7. R+markdown+LaTeX 中文编译解决方案
  8. JAVA面向对象OOP→构造方法、this、访问修饰符、static、方法重载、JVM内存分配、GC垃圾回收、包、样例代码
  9. java爬虫框架_Python,爬虫开发的不二选择
  10. bzoj:1828: [Usaco2010 Mar]balloc 农场分配
  11. 安卓版的水经注地图_水经注万能地图下载器
  12. ap音频测试仪软件,AP APX-525音频分析仪
  13. Python - 多个Excel合并 (列不同序 或 列数不同)
  14. LittleVGL-键盘控件
  15. RAID磁盘列阵介绍
  16. WWW 2017精选论文
  17. 全面了解风控决策引擎
  18. XML:Schema、三种编写Schema的方式
  19. 碧波庭---第十五届中国诚信企业家大会 — 碧波庭荣获 “中国美胸产业诚信品牌” !
  20. 终于还是对B站动漫动手了!【数据可视化分析】

热门文章

  1. 正则表达式的一些探索(偏JavaScript)
  2. js for循环给object数组赋值
  3. Tomcat输出catalina.out的大小控制
  4. andriod的apk文件相关的编译反编译工具
  5. 【Oracle Database 12c新特性】ASM Scrubbing Disk Groups
  6. InfoPath开发经验小节
  7. Anaconda3-5.3.0-Windows-x86_64
  8. Js实现类似PHP中的in_array方法
  9. 每天一点点之vue框架开发 - vue组件之间传值(父向子传值)
  10. 查看eclipse安装了哪些插件