Python序列化的使用(有少量修改)
使用語句示例:
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):源碼實例:
(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?允許在值之間有任意數目的空白(空格, 跳格, 回車,換行)??瞻资恰盁o關緊要的”,這意味著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的數字意味著“每個值單獨一行并且使用這個數目的空格來縮進嵌套的數據結構?!?/td> |
這是結果:
<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數據類型完全缺少??纯茨隳苣馨阉鼈冎赋鰜?
| 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?是一個基于文本的格式??偸菓褂胾tf-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?對象。 |
盡管得到另一個不同的異??雌饋聿皇鞘裁催M步, 但它確實是個進步! 再調整一下就可以解決這個問題。
?????? 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序列化的使用(有少量修改)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 悟空启蒙app暗号破解版
- 下一篇: websocket python爬虫_p