背景
json 是一種輕量級的資料交換格式。易於人閱讀和編寫,同時也易於機器解析和生成。
一般表現形式是一個無序的 鍵值對 的集合。
資料:
官方文件: https://docs.python.org/3/library/json.html#module-json
python操作json的其他方式:
編碼(dump)
1. 將字串轉化為json串(dumps)
import json a="\"foo\bar" result=json.dumps(a) print(result) print(type(result))
執行結果:
"\"foo\bar" <class 'str'>
2. 將列表轉化為json串(dumps)
import json a=['foo', {'bar': ('baz', None, 1.0, 2)}] result=json.dumps(a) print(result) print(type(result))
執行結果:
["foo", {"bar": ["baz", null, 1.0, 2]}] <class 'str'>
3. 將字典轉化為json串(dumps)
import json a={"c": 0, "b": 0, "a": 0} result=json.dumps(a) print(result) print(type(result))
執行結果:
{"c": 0, "b": 0, "a": 0} <class 'str'>
4. 轉化字典為json串時,進行排序(dumps)
import json a={"c": 0, "b": 0, "a": 0} result=json.dumps(a, sort_keys=True) print(result)
執行結果:
{"a": 0, "b": 0, "c": 0}
對照上一個例子,可以看到json串按照字典的key進行了排序。
5. 定義json串縮排(dumps)
import json a=[1,2,3,{'4': 5, '6': 7}] result=json.dumps(a, indent=4) print(result)
執行結果:
[ 1, 2, 3, { "6": 7, "4": 5 } ]
可以看到json串輸出時採用了定義的4個空格進行縮排。
6. 將產生的json串輸出到檔案流(dump)
import json myfile=open('a.txt','w') a=[1,2,3,{'4': 5, '6': 7}] json.dump(a,myfile, indent=4) myfile.close()
執行之後,開啟 a.txt 檔案進行檢視:
[ 1, 2, 3, { "6": 7, "4": 5 } ]
解碼(load)
1. 將json串解碼為列表(loads)
import json json_str='["foo", {"bar":["baz", null, 1.0, 2]}]' result=json.loads(json_str) print(result) print(type(result))
執行結果:
['foo', {'bar': ['baz', None, 1.0, 2]}] <class 'list'>
可以看到,這裡講json串解碼為一個list。
2. 將json串解碼為字典(loads)
import json json_str='{"a": 0, "b": 0, "c": 0}' result=json.loads(json_str) print(result) print(type(result))
執行結果:
{'a': 0, 'c': 0, 'b': 0} <class 'dict'>
3. 從檔案流解碼json串(load)
以上面dump生成的a.txt為例。
import json myfile=open("a.txt",'r') # json_str='{"a": 0, "b": 0, "c": 0}' result=json.load(myfile) print(result) print(type(result)) myfile.close()
執行結果:
[1, 2, 3, {'6': 7, '4': 5}] <class 'list'>
可以看到成功將a.txt的內容解碼為list。
其他
1. dumps 和 dump 的區別
下面是兩個函式的定義:
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)
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw)
可以看到,dump比 dumps多了一個引數 fp。
dumps 會直接將生成的 json串 返回,也就是可以採取 json_str=dumps()的方式來獲取結果。
但是 dump 沒有返回值,它會將生成的 json串 輸出到 fp 流中。
2. loads 和 load 的區別
下面是兩個函式的定義:
load(fp, cls=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
可以看到 load 的前兩個引數是 fp 以及 cls,而 loads 的前兩個引數是 s 和 encoding。
loads 會將 json串直接進行解碼輸出。
load 是從 fp 檔案流中讀取json串,然後進行解碼輸出。本質load函式定義的時候還是呼叫的 load函式。
3. 抓取請求,並解析json內容
這裡採用的是python 的 requests 庫進行抓取。
import json import requests r=requests.get('http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600') print(type(r.text)) json_str=r.text result=json.loads(json_str) print(result) print(type(result)) if result['id']==26096: print("success") else: print("fail")
執行結果如下:
<class 'str'> {'imageWidth': 512, 'totalUrl': 'http://baike.baidu.com/view/26096.htm', 'card': [{'name': '中文名', 'format': ['銀魂'], 'key': 'm21_bookname', 'value': ['銀魂']}], 'key': '銀魂', 'id': 26096, 'isSummaryPic': 'y', 'hasOther': 1, ……<class 'dict'> success
這裡首先採用request.get 抓取json網頁,然後對 r.text 網頁內容進行解析。如果網頁內容 id 值為 26096的話,這裡就列印success。
備註:當然,這裡也可以直接使用 r.json()進行json解析。