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!