Python3中對(duì)json格式數(shù)據(jù)的分析處理
前言
數(shù)據(jù)已經(jīng)過(guò)修改,以防泄密,請(qǐng)放心閱讀
今天同事提出一個(gè)需求,要求我修改之前的某腳本,該腳本的作用是獲取zabbix監(jiān)控系統(tǒng)返回的json數(shù)據(jù),我的任務(wù)是使其變成易讀的文本,如何獲取數(shù)據(jù)不在此贅述,只描述如何對(duì)json數(shù)據(jù)進(jìn)行處理
一、如何將json數(shù)據(jù)轉(zhuǎn)換成python內(nèi)部的數(shù)據(jù)類(lèi)型
展示一下zabbix的接口返回的json數(shù)據(jù)(數(shù)據(jù)經(jīng)過(guò)dumps編碼了,因?yàn)樵瓟?shù)據(jù)為str類(lèi)型,只有一行,不易讀)
js = json.dumps(get_alert(), indent=4, ensure_ascii=False) print(js) # get_alert()方法為獲取json數(shù)據(jù),編碼后賦給js,打印js,結(jié)果如下: # indent = 4意為設(shè)置縮進(jìn)為4個(gè)空格, # ensure_ascii=False參數(shù)是禁用ascii編碼,若不禁用,中文字符會(huì)輸出為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" }
接下來(lái)我們需要對(duì)json對(duì)象進(jìn)行解碼
js_loads_data = json.loads(js) # 解碼后的數(shù)據(jù)轉(zhuǎn)為python原生的字典類(lèi)型(dict)
我們需要之后json對(duì)象里面的數(shù)據(jù)類(lèi)型解碼為dict之后與之對(duì)應(yīng)的數(shù)據(jù)類(lèi)型、
json | python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
記不住沒(méi)有關(guān)系,有方法可以現(xiàn)查:
print(type(js_loads_data)) >>><class 'dict'>
通過(guò)type()方法可以查看解碼后數(shù)據(jù)js_loads_data的數(shù)據(jù)類(lèi)型,發(fā)現(xiàn)他說(shuō)字典類(lèi)型,由此知道如何訪問(wèn)它內(nèi)部的數(shù)據(jù)
print(js_loads_data["id"]) >>>3 print(type(js_loads_data["id"])) >>><class 'str'>
訪問(wèn)字典的值直接通過(guò)改變量的下標(biāo)訪問(wèn)即可
同理
print(type(js_loads_data["result"]))
可以取出result數(shù)組,但是這樣是打印整個(gè)數(shù)組,那么如何取result數(shù)組的里面的值呢?
二、訪問(wèn)json對(duì)象里嵌套的數(shù)組
我們知道,json對(duì)象轉(zhuǎn)為字典后,數(shù)組對(duì)應(yīng)的類(lèi)型為列表(list)
所以我們可以通
print(type(js_loads_data["result"])) >>><class 'list'>
過(guò)列表的下標(biāo)來(lái)訪問(wèn)列表的內(nèi)容
print(js_loads_data['result'][0]) # 可以將列表下標(biāo)為0的一個(gè)數(shù)據(jù)取出來(lái) print(type(js_loads_data['result'][0])) >>><class 'dict'> # 打印類(lèi)型發(fā)現(xiàn),列表里面的第一個(gè)元素為字典類(lèi)型,那么我們又知道了如何訪問(wèn)該字典里面的數(shù)據(jù): 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)'}] >>>略 # 依次打印鍵和值,觀察后發(fā)現(xiàn)hosts和items兩個(gè)元素還是列表類(lèi)型,如要取值還要進(jìn)行處理
btw,分享一個(gè)取出列表所有元素的簡(jiǎn)便方法:
result_list= [(item.get('hosts', 'NA')) for item in js_loads_data['result']]
這樣處理之后js_loads_data[‘result']三個(gè)字典里面的result列表已經(jīng)被我取出來(lái)賦值給result_list這個(gè)列表了,現(xiàn)在result_list是列表嵌套列表再嵌套字典的類(lèi)型(不太好理解,注意觀察上面的json數(shù)據(jù)),這樣使接下來(lái)的操作更為簡(jiǎn)單
for tmp in result_list: print(tmp[0].get('name')) >>>windows sever >>>linus
處理完成
三、總結(jié)
拿到一個(gè)json不要慌,
先編碼解碼,轉(zhuǎn)成python原生的數(shù)據(jù)類(lèi)型一步步分析,用print(type(元素))的方法捋清楚每個(gè)元素的類(lèi)型,明白整個(gè)json串的結(jié)構(gòu)搞明白每個(gè)類(lèi)型的訪問(wèn)方法這樣我們就可以對(duì)整個(gè)json數(shù)據(jù)為所欲為了!
到此這篇關(guān)于Python3中對(duì)json格式數(shù)據(jù)的分析處理的文章就介紹到這了,更多相關(guān)Python json格式數(shù)據(jù)分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python3實(shí)現(xiàn)從kafka獲取數(shù)據(jù),并解析為json格式,寫(xiě)入到mysql中
- python3 json數(shù)據(jù)格式的轉(zhuǎn)換(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互轉(zhuǎn)換)
- Python3實(shí)現(xiàn)將本地JSON大數(shù)據(jù)文件寫(xiě)入MySQL數(shù)據(jù)庫(kù)的方法
- 解決python3 json數(shù)據(jù)包含中文的讀寫(xiě)問(wèn)題
- python 正則表達(dá)式獲取字符串中所有的日期和時(shí)間
- python中日期和時(shí)間格式化輸出的方法小結(jié)
- python操作日期和時(shí)間的方法
- Python3 JSON 數(shù)據(jù)解析及日期和時(shí)間小結(jié)
相關(guān)文章
解決torch.autograd.backward中的參數(shù)問(wèn)題
今天小編就為大家分享一篇解決torch.autograd.backward中的參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python實(shí)現(xiàn)自動(dòng)登錄人人網(wǎng)并采集信息的方法
這篇文章主要介紹了python實(shí)現(xiàn)自動(dòng)登錄人人網(wǎng)并采集信息的方法,涉及Python模擬登陸及正則匹配的相關(guān)技巧,需要的朋友可以參考下2015-06-06Python selenium自動(dòng)化測(cè)試模型圖解
這篇文章主要介紹了Python selenium自動(dòng)化測(cè)試模型圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04使用pandas忽略行列索引,縱向拼接多個(gè)dataframe
這篇文章主要介紹了使用pandas忽略行列索引,縱向拼接多個(gè)dataframe的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘
pyglet是一個(gè)面向Python的跨平臺(tái)窗口、多媒體庫(kù),它可以用于創(chuàng)建游戲和多媒體應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于如何一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘,需要的朋友可以參考下2024-03-03python圖片由RGB空間轉(zhuǎn)成LAB空間的實(shí)現(xiàn)方式
這篇文章主要介紹了python圖片由RGB空間轉(zhuǎn)成LAB空間的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10從Pytorch模型pth文件中讀取參數(shù)成numpy矩陣的操作
這篇文章主要介紹了從Pytorch模型pth文件中讀取參數(shù)成numpy矩陣的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03