使用python解析json字段的3種方式實例
1、運用re、json、jsonpath包解析json思路
(1)re:正則表達式,通過json的形式對癥下藥,寫表達式去解析json;
(2)json: 通過json中的json.loads()方法,將str類型轉為dict類型,運用python字典的數據結構特點去解析json;
(3)jsonpath:對比與json包,jsonpath可以根據路徑去解析json,比較適合用來解析json中帶“[ ]”的數據。
2、三種方式的json解析案例
#json數據樣式,本文采用帶[]的數據樣式 { "version": "version 1.0.12", "result": { "pages": 1314, "data": [ { "name": "大明", "IDcard": "440588190001015688", "address": "廣東省廣州市天河區(qū)正佳廣場99樓520號", }, { "name": "二明", "IDcard": "440588190012317456", "address": "廣東省廣州市天河區(qū)天環(huán)廣場88樓520號", } ] } }
(1)運用re正則表達式解析json
import re jsondata={ "version": "23231cimesfedkk", "result": { "pages": 1314, "data": [ { "name": "大明", "IDcard": "440588190001015688", "address": "廣東省廣州市天河區(qū)正佳廣場99樓520號", }, { "name": "二明", "IDcard": "440588190012317456", "address": "廣東省廣州市天河區(qū)天環(huán)廣場88樓520號", } ] } } if __name__ == '__main__': name_list=re.findall(r"'name': '(\w*)'",str(jsondata)) IDcard_list=re.findall(r"'IDcard': '(\w{18})'", str(jsondata))#身份證18位數字和字母組合 address_list=re.findall(r"'address': '(\w*)'", str(jsondata))#地址 print(name_list) print(IDcard_list) print(address_list)
運行結果:
['大明', '二明']
['440588190001015688', '440588190012317456']
['廣東省廣州市天河區(qū)正佳廣場99樓520號', '廣東省廣州市天河區(qū)天環(huán)廣場88樓520號']
(2)運用字典的數據結構性質解析json
import json jsondata={"version": "23231cimesfedkk","result": {"pages": 1314,"data": [{"name": "大明","IDcard": "440588190001015688","address": "廣東省廣州市天河區(qū)正佳廣場99樓520號",},{"name": "二明","IDcard": "440588190012317456","address": "廣東省廣州市天河區(qū)天環(huán)廣場88樓520號",}]}} if __name__ == '__main__': # 若傳入的數據為str類型需要將它轉成dict類型 # result = json.loads(jsondata) jsondata = jsondata["result"]["data"] resultdata = jsondata namelist=[] idcardlist=[] addresslist=[] for data in resultdata: namelist.append(data['name']) idcardlist.append(data['IDcard']) addresslist.append(data['address']) print(namelist) print(idcardlist) print(addresslist)
運行結果:
['大明', '二明']
['440588190001015688', '440588190012317456']
['廣東省廣州市天河區(qū)正佳廣場99樓520號', '廣東省廣州市天河區(qū)天環(huán)廣場88樓520號']
(3)運用jsonpath的路徑解析json
import jsonpath jsondata={"version": "23231cimesfedkk","result": {"pages": 1314,"data": [{"name": "大明","IDcard": "440588190001015688","address": "廣東省廣州市天河區(qū)正佳廣場99樓520號",},{"name": "二明","IDcard": "440588190012317456","address": "廣東省廣州市天河區(qū)天環(huán)廣場88樓520號",}]}} if __name__ == '__main__': namelist=[] idcardlist=[] addresslist=[] #運用jsonpath.jsonpath(字典數據, 路徑) namelist=jsonpath.jsonpath(jsondata, '$..name') idcardlist=jsonpath.jsonpath(jsondata, '$..IDcard') addresslist=jsonpath.jsonpath(jsondata, '$..address') print(namelist) print(idcardlist) print(addresslist)
運行結果:
['大明', '二明']
['440588190001015688', '440588190012317456']
['廣東省廣州市天河區(qū)正佳廣場99樓520號', '廣東省廣州市天河區(qū)天環(huán)廣場88樓520號']
3、附錄:re正則表達式語法
附:python 處理非標準 json 格式字符串
在寫爬蟲的時候,會發(fā)現很多數據都是通過 json 格式進行傳輸的,標準的 json 我們可以將其轉化為 Python 中的數據類型,進行查詢,但對于一些類似于 json 但又非標準 json 格式的字符,就會比較頭疼了,這里統(tǒng)計一些咱遇到的非標準的 json 格式,及相應的解析方法。
字符串中 key 的值沒有被單引號包裹
類似于這種字符,看上去格式和 json 很像(眼尖的朋友可能發(fā)現了,這是 qq 的數據 嘿嘿),但仔細觀察會發(fā)現,這其中的 key 沒有被單引號包裹起來,這就導致了它無法被簡單的解析為字典類型,因為解析的時候 key 會被解析成相應的變量而非字符,這些變量又都沒有定義,所以會報錯。
那怎么辦呢?咱的第一反應是利用正則去人為構造成標準的格式,不過這個難度系數有點大,對正則的要求挺高,還費腦子,明顯不符合咱的風格。于是咱就去網上找了一下,有沒有現成的方法,還真有呢:
使用 demjson
首先安裝 demjson
pip install demjson
s = '{suggestion:[{query:"London",interpretation: \'abc\'}]}' dict1 = demjson.decode(s) print(dict1) {'suggestion': [{'interpretation': 'abc', 'query': 'London'}]}
總結
到此這篇關于使用python解析json字段的3種方式的文章就介紹到這了,更多相關python解析json字段內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python虛擬環(huán)境Virtualenv使用教程
這篇文章主要介紹了Python虛擬環(huán)境Virtualenv簡明教程,本文整合了兩篇關于Virtualenv的使用教程,相信大家有通過本文一定可以學會如何使用Virtualenv,需要的朋友可以參考下2015-05-05