## json
就傳遞數據而言,xml是一種選擇,還有另外一種,就是json,它是一種輕量級的數據交換格式,如果讀者要做web編程,是會用到它的。根據維基百科的相關內容,對json了解一二:
> JSON(JavaScript Object Notation)是一種由道格拉斯·克羅克福特構想設計、輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文本格式,並且採用了類似於C語言家族的一些習慣。
關于json更為詳細的內容,可以參考其官方網站:[http://www.json.org](http://www.json.org/)
從官方網站上摘取部分,了解一下json的結構:
> JSON建構于兩種結構:
* “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
* 值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數組(array)。
python標準庫中有json模塊,主要是執行序列化和反序列化功能:
* 序列化:encoding,把一個python對象編碼轉化成json字符串
* 反序列化:decoding,把json格式字符串解碼轉換為python數據對象
### [](https://github.com/qiwsir/StarterLearningPython/blob/master/227.md#基本操作)基本操作
json模塊相對xml單純了很多:
~~~
>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']
~~~
**encoding: dumps()**
~~~
>>> data = [{"name":"qiwsir", "lang":("python", "english"), "age":40}]
>>> print data
[{'lang': ('python', 'english'), 'age': 40, 'name': 'qiwsir'}]
>>> data_json = json.dumps(data)
>>> print data_json
[{"lang": ["python", "english"], "age": 40, "name": "qiwsir"}]
~~~
encoding的操作是比較簡單的,請注意觀察data和data_json的不同——lang的值從元組編程了列表,還有不同:
~~~
>>> type(data_json)
<type 'str'>
>>> type(data)
<type 'list'>
~~~
將python對象轉化為json類型,是按照下表所示對照關系轉化的:
| python==> | json |
| --- | --- |
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
**decoding: loads()**
decoding的過程也像上面一樣簡單:
~~~
>>> new_data = json.loads(data_json)
>>> new_data
[{u'lang': [u'python', u'english'], u'age': 40, u'name': u'qiwsir'}]
~~~
需要注意的是,解碼之后,并沒有將元組還原。
解碼的數據類型對應關系:
| json==> | python |
| --- | --- |
| object | dict |
| array | list |
| string | unicode |
| number(int) | int, long |
| number(real) | float |
| true | True |
| false | False |
| null | None |
**對人友好**
上面的data都不是很長,還能湊合閱讀,如果很長了,閱讀就有難度了。所以,json的dumps()提供了可選參數,利用它們能在輸出上對人更友好(這對機器是無所謂的)。
~~~
>>> data_j = json.dumps(data, sort_keys=True, indent=2)
>>> print data_j
[
{
"age": 40,
"lang": [
"python",
"english"
],
"name": "qiwsir"
}
]
~~~
`sort_keys=True`意思是按照鍵的字典順序排序,`indent=2`是讓每個鍵值對顯示的時候,以縮進兩個字符對齊。這樣的視覺效果好多了。
### [](https://github.com/qiwsir/StarterLearningPython/blob/master/227.md#大json字符串)大json字符串
如果數據不是很大,上面的操作足夠了。但是,上面操作是將數據都讀入內存,如果太大就不行了。怎么辦?json提供了`load()`和`dump()`函數解決這個問題,注意,跟上面已經用過的函數相比,是不同的,請仔細觀察。
~~~
>>> import tempfile #臨時文件模塊
>>> data
[{'lang': ('python', 'english'), 'age': 40, 'name': 'qiwsir'}]
>>> f = tempfile.NamedTemporaryFile(mode='w+')
>>> json.dump(data, f)
>>> f.flush()
>>> print open(f.name, "r").read()
[{"lang": ["python", "english"], "age": 40, "name": "qiwsir"}]
~~~
### [](https://github.com/qiwsir/StarterLearningPython/blob/master/227.md#自定義數據類型)自定義數據類型
一般情況下,用的數據類型都是python默認的。但是,我們學習過類后,就知道,自己可以定義對象類型的。比如:
以下代碼參考:[Json概述以及python對json的相關操作](http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html)
~~~
#!/usr/bin/env python
# coding=utf-8
import json
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __repr__(self):
return 'Person Object name : %s , age : %d' % (self.name,self.age)
def object2dict(obj): #convert Person to dict
d = {}
d['__class__'] = obj.__class__.__name__
d['__module__'] = obj.__module__
d.update(obj.__dict__)
return d
def dict2object(d): #convert dict ot Person
if '__class__' in d:
class_name = d.pop('__class__')
module_name = d.pop('__module__')
module = __import__(module_name)
class_ = getattr(module, class_name)
args = dict((key.encode('ascii'), value) for key,value in d.items()) #get args
inst = class_(**args) #create new instance
else:
inst = d
return inst
if __name__ == '__main__':
p = Person('Peter',40)
print p
d = object2dict(p)
print d
o = dict2object(d)
print type(o), o
dump = json.dumps(p, default=object2dict)
print dump
load = json.loads(dump, object_hook=dict2object)
print load
~~~
- 第零章 預備
- 關于Python的故事
- 從小工到專家
- Python安裝
- 集成開發環境
- 第壹章 基本數據類型
- 數和四則運算
- 除法
- 常用數學函數和運算優先級
- 寫一個簡單的程序
- 字符串(1)
- 字符串(2)
- 字符串(3)
- 字符串(4)
- 字符編碼
- 列表(1)
- 列表(2)
- 列表(3)
- 回顧list和str
- 元組
- 字典(1)
- 字典(2)
- 集合(1)
- 集合(2)
- 第貳章 語句和文件
- 運算符
- 語句(1)
- 語句(2)
- 語句(3)
- 語句(4)
- 語句(5)
- 文件(1)
- 文件(2)
- 迭代
- 練習
- 自省
- 第叁章 函數
- 函數(1)
- 函數(2)
- 函數(3)
- 函數(4)
- 函數練習
- 第肆章 類
- 類(1)
- 類(2)
- 類(3)
- 類(4)
- 類(5)
- 多態和封裝
- 特殊方法(1)
- 特殊方法(2)
- 迭代器
- 生成器
- 上下文管理器
- 第伍章 錯誤和異常
- 錯誤和異常(1)
- 錯誤和異常(2)
- 錯誤和異常(3)
- 第陸章 模塊
- 編寫模塊
- 標準庫(1)
- 標準庫(2)
- 標準庫(3)
- 標準庫(4)
- 標準庫(5)
- 標準庫(6)
- 標準庫(7)
- 標準庫(8)
- 第三方庫
- 第柒章 保存數據
- 將數據存入文件
- mysql數據庫(1)
- MySQL數據庫(2)
- mongodb數據庫(1)
- SQLite數據庫
- 電子表格
- 第捌章 用Tornado做網站
- 為做網站而準備
- 分析Hello
- 用tornado做網站(1)
- 用tornado做網站(2)
- 用tornado做網站(3)
- 用tornado做網站(4)
- 用tornado做網站(5)
- 用tornado做網站(6)
- 用tornado做網站(7)
- 第玖章 科學計算
- 為計算做準備
- Pandas使用(1)
- Pandas使用(2)
- 處理股票數據
- 附:網絡文摘
- 如何成為Python高手
- ASCII、Unicode、GBK和UTF-8字符編碼的區別聯系