json的優勢:
1. 數據體積方面。
JSON相對於XML來講,數據的體積小,傳遞的速度更快些。
2. 傳輸速度方面。
JSON的速度要遠遠快於XML
3. 數據格式
數據格式比較簡單, 易於讀寫, 格式都是壓縮的。
4. 與python的交互使用方便
json 是 k-v結構的形式,
簡單來說, 如果是一個key,對應一個value.中間用 : 分隔,最外面用{}包圍, 不同鍵值對之間用逗號,隔開
{‘key1’: 'value1', 'key2': 'value2', 'key3': 'value3'}
如果有一個Key對應着多個value的情況,用[]把對應的所有value包括起來。
{'key1': ['v11', 'v12', 'v13'], 'key2':'v22'}
復雜一點的還有這樣的,不過其實原理都一樣。
{ "people":[ { "firstName": "Brett", "lastName":"McLaughlin" }, { "firstName":"Jason", "lastName":"Hunter" } ] }
json是什么呢?
- 是一種輕量級的數據交換格式。
- 完全獨立於編程語言的文本格式來存儲和表示數據。
- 簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閱讀和編寫,易於機器解析和生成,並有效地提升網絡傳輸效率。
json JavaScript Object Notation(JS對象標記)和JavaScript 的關系
JSON格式在語法上與創建JavaScript對象的代碼相同。由於這種相似性,JavaScript程序可以輕松地將JSON數據轉換為JavaScript對象。JavaScript是一種語言, 而json終其還是一種文本格式,是一堆字符串。
由於json是文本格式, 我們要用python去操縱它,首先需要把這種格式轉換為python中的字典。
with open('finance/finance_company.json', encoding='utf-8') as f: line = f.readline() print(type(line)) f.close()
輸出結果:
<class 'str'>
可以看出來,我們從json格式中讀出來為str類型。
我們調用json庫的loads方法。
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
object_hook是一個可選的函數,它將被任何對象字面值解碼(dict)的結果調用。將使用object_hook的返回值而不是dict。該特征可以用於實現定制解碼器(例如,JSON-RPC類提示)。
object_pairs_hook是一個可選的函數,它將使用任何對象字面值的結果進行調用,並使用對的有序列表進行解碼。將使用object_pairs_hook的返回值,而不是dict。該特征可以用於實現依賴於鍵和值對被解碼的順序的自定義解碼器(例如,collections.OrderedDict()將記住插入的順序)。如果還定義了object_hook,則object_pairs_hook優先。
parse_float(如果指定)將使用要解碼的每個JSON浮點的字符串進行調用。默認情況下,這相當於float(num_str)。這可以用於使用另一個數據類型或解析器為JSON浮動(例如。decimal.Decimal)。
parse_int(如果指定)將使用要解碼的每個JSON int的字符串進行調用。默認情況下,這相當於int(num_str)。這可以用於使用另一個數據類型或解析器為JSON整數(例如。float)。
parse_constant如果指定,將使用以下字符串之一調用:'-Infinity','Infinity','NaN'。這可以用於引發異常,如果遇到無效的JSON數字。
在版本3.1中更改: parse_constant不會在“null”,“true”和“false”上調用。
要使用自定義JSONDecoder子類,請使用cls kwarg;否則使用JSONDecoder。額外的關鍵字參數將被傳遞給類的構造函數。
json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
除了多了一個編碼參數, 其余的都與json.load一樣。
json.load用來加載文件, 而json.loads用來加載字符串(很明顯,因為多了個s(string))
import json with open('finance/finance_company.json', encoding='utf-8') as f: line = f.readline() d = json.loads(line) print(type(d)) f.close()
輸出:
<class 'dict'>
讀取范例:
new.json
{"name": "異享金融", "company_url": "http://www.yixiangjinrong.com", "telphone": "0371-55056647", "crawl_time": "2017-07-13 16:11:16"}
readjson.py
import json with open('test.json', encoding='utf-8') as f: line = f.readline() d = json.loads(line) name = d['name'] company_url = d['company_url'] telephone = d['telphone'] crawl_time = d['crawl_time'] print(name, company_url, telephone, crawl_time) f.close()
輸出結果:
異享金融 http://www.yixiangjinrong.com 0371-55056647 2017-07-13 16:11:16
這樣就成功的讀取了json文件啦。
寫json文件
json.dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
json模塊總是產生str對象,而不是bytes對象。因此,fp.write()必須支持str輸入。
如果ensure_ascii為true(默認值),則輸出將保證所有傳入的非ASCII字符都轉義。如果ensure_ascii為false,則這些字符將按原樣輸出。
如果check_circular為false(默認值:True),則將跳過容器類型的循環引用檢查,循環引用將導致OverflowError
如果allow_nan為false(默認值:True),則將是ValueError序列化超出范圍float值(nan,inf,-inf),嚴格遵守JSON規范。如果allow_nan為true,則將使用與其等效的JavaScript代碼(NaN,Infinity,-Infinity)。
如果縮進是非負整數或字符串,那么JSON數組元素和對象成員將以該縮進級別打印。縮進級別0,負數或""將只插入換行符。None(默認值)選擇最緊湊的表示。使用正整數縮進縮進,每個級別有許多空格。如果縮進是字符串(例如"\t"),則該字符串用於縮進每個級別。
如果sort_keys為真(默認值:False),則字典的輸出將按鍵排序。
使用默認的 ensure_ascii=True時, json文件變成了這樣:
{"name": "\u4e24\u53ea\u8001\u864e", "company_url": "http://www.twotiger.com/", "telphone": "010-64789918", "crawl_time": "2017-07-16 22:57:15"}
ensure_ascii=Flase, 中文就成功出現
{"name": "異享金融", "company_url": "http://www.yixiangjinrong.com", "telphone": "0371-55056647", "crawl_time": "2017-07-13 16:11:16"}
因為該方法把我們的中文自動轉義了, 變成了ASCII碼, 所以導致了中文看着錯亂了。加上這句就好了。
如何讀取完整的文件
上面主要示例了json的使用。但是在實際開發過程中我們是需要對這個文件進行讀取的。下面我們看看如何讀取。
我們都應該知道python讀取文件有三種方法。
read(), readline(), radlines()
read()直接讀取出字符串,並且字符串或者字符對象返回。
readline() 讀取文本中的一行
readlines() 讀取文本中的所有內容並放入緩存區。
下面是使用的readline讀取整個文本示例:
with open(file_path, 'r', encoding='utf-8') as f: try: while True: line = f.readline() if line: r = json.loads(line) # print(r) else: break except: f.close()
這樣就可以讀取所有文本並解析成Python可以操作的數據模式了