Python3中對json格式數據的分析處理
前言
數據已經過修改,以防泄密,請放心閱讀
今天同事提出一個需求,要求我修改之前的某腳本,該腳本的作用是獲取zabbix監控系統返回的json數據,我的任務是使其變成易讀的文本,如何獲取數據不在此贅述,隻描述如何對json數據進行處理
一、如何將json數據轉換成python內部的數據類型
展示一下zabbix的接口返回的json數據(數據經過dumps編碼瞭,因為原數據為str類型,隻有一行,不易讀)
js = json.dumps(get_alert(), indent=4, ensure_ascii=False) print(js) # get_alert()方法為獲取json數據,編碼後賦給js,打印js,結果如下: # indent = 4意為設置縮進為4個空格, # ensure_ascii=False參數是禁用ascii編碼,若不禁用,中文字符會輸出為ASCII碼
{ "jsonrpc": "2.0", "result": [ { "triggerid": "123456", "expression": "{23567}>95", "description": "High memory utilization > 95", "url": "", "status": "0", "value": "1", "priority": "4", "lastchange": "123456", "comments": "", "error": "", "templateid": "0", "type": "0", "state": "0", "flags": "0", "recovery_mode": "0", "recovery_expression": "", "correlation_mode": "0", "correlation_tag": "", "manual_close": "0", "opdata": "", "hosts": [ { "hostid": "8888", "name": "window_sever" } ], "items": [ { "itemid": "123456", "name": "Memory utilization", "description": "Memory used percentage is calculated as (100-pavailable)" } ] }, { "triggerid": "17099", "expression": "{20221}<{$SWAP.PFREE.MIN.WARN} and {20222}>0", "description": "High swap space usage ( less than 20% free)", "url": "", "status": "0", "value": "1", "priority": "2", "lastchange": "123456789", "comments": "This trigger is ignored, if there is no swap configured", "error": "", "templateid": "16176", "type": "0", "state": "0", "flags": "0", "recovery_mode": "0", "recovery_expression": "", "correlation_mode": "0", "correlation_tag": "", "manual_close": "0", "opdata": "Free: {ITEM.LASTVALUE1}, total: {ITEM.LASTVALUE2}", "hosts": [ { "hostid": "10325", "name": "linus" } ], "items": [ { "itemid": "31681", "name": "Free swap space in %", "description": "" }, { "itemid": "123456", "name": "Total swap space", "description": "" } ] } ], "id": "3" }
接下來我們需要對json對象進行解碼
js_loads_data = json.loads(js) # 解碼後的數據轉為python原生的字典類型(dict)
我們需要之後json對象裡面的數據類型解碼為dict之後與之對應的數據類型、
json | python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
記不住沒有關系,有方法可以現查:
print(type(js_loads_data)) >>><class 'dict'>
通過type()方法可以查看解碼後數據js_loads_data的數據類型,發現他說字典類型,由此知道如何訪問它內部的數據
print(js_loads_data["id"]) >>>3 print(type(js_loads_data["id"])) >>><class 'str'>
訪問字典的值直接通過改變量的下標訪問即可
同理
print(type(js_loads_data["result"]))
可以取出result數組,但是這樣是打印整個數組,那麼如何取result數組的裡面的值呢?
二、訪問json對象裡嵌套的數組
我們知道,json對象轉為字典後,數組對應的類型為列表(list)
所以我們可以通
print(type(js_loads_data["result"])) >>><class 'list'>
過列表的下標來訪問列表的內容
print(js_loads_data['result'][0]) # 可以將列表下標為0的一個數據取出來 print(type(js_loads_data['result'][0])) >>><class 'dict'> # 打印類型發現,列表裡面的第一個元素為字典類型,那麼我們又知道瞭如何訪問該字典裡面的數據: for key in js_loads_data['result'][0]: print(key, ":", js_loads_data['result'][0][key]) >>>略 >>>hosts : [{'hostid': '10358', 'name': 'FTPC01(192.168.19.5)'}] >>>items : [{'itemid': '33152', 'name': 'Memory utilization', 'description': 'Memory used percentage is calculated as (100-pavailable)'}] >>>略 # 依次打印鍵和值,觀察後發現hosts和items兩個元素還是列表類型,如要取值還要進行處理
btw,分享一個取出列表所有元素的簡便方法:
result_list= [(item.get('hosts', 'NA')) for item in js_loads_data['result']]
這樣處理之後js_loads_data[‘result’]三個字典裡面的result列表已經被我取出來賦值給result_list這個列表瞭,現在result_list是列表嵌套列表再嵌套字典的類型(不太好理解,註意觀察上面的json數據),這樣使接下來的操作更為簡單
for tmp in result_list: print(tmp[0].get('name')) >>>windows sever >>>linus
處理完成
三、總結
拿到一個json不要慌,
先編碼解碼,轉成python原生的數據類型一步步分析,用print(type(元素))的方法捋清楚每個元素的類型,明白整個json串的結構搞明白每個類型的訪問方法這樣我們就可以對整個json數據為所欲為瞭!
到此這篇關於Python3中對json格式數據的分析處理的文章就介紹到這瞭,更多相關Python json格式數據分析內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python中json.load()和json.loads()有哪些區別
- 詳細解讀python操作json文件的詳細
- Python對象與json數據的轉換問題實例詳解
- Python序列化模塊之pickle與json詳解
- Python常用標準庫詳解(pickle序列化和JSON序列化)