一篇長文帶你在python裡玩轉Json資料
Json簡介
Json(JavaScript Object Notation)
很多網站都會用到Json格式來進行資料的傳輸和交換。
這因為Json是一種輕量級的資料交換格式,具有資料格式簡單,讀寫方便易懂等很多優點。用它來進行前後端的資料傳輸,大大的簡化了伺服器和客戶端的開發工作量。
而且相對於XML來說,更加的輕量級,更方便解析。
今天我們講講如何在python裡玩轉Json資料?
在Json中,遵循“key-value”的這樣一種方式。
比如最簡單的這種:“{"name" : "zhuxiao5"}”,跟python 裡的字典似的,也是一個Json格式的資料。
複雜一點的比如這種(後文會多次使用到這個例子):
{
"animals": {
"dog": [
{
"name": "Rufus",
"age":15
},
{
"name": "Marty",
"age": null
}
]
}
}
以上圖為例,再多說幾句Json格式的特點
物件通過鍵值對錶現;
鍵通過雙引號包裹,後面跟冒號“:”,然後跟該鍵的值;
值可以是字串、數字、陣列等資料型別;
物件與物件之間用逗號隔開;
“{}”用來表達物件;
“[]”用來表達陣列;
Python中的Json模組
Python中也自帶了Json模組,其中json.dumps()、json.loads()較為常用。
json.dumps() 是將 python 物件轉化為 json。
json.loads() 是將 json 轉化為 python 物件。
#json.dumps(),json.loads()
import json
dict_data = {"a": 1, "b": 2}
# 將dict格式資料轉換成json格式字串
dump_data = json.dumps(dict_data)
# 將json格式字串轉換成對應的python值
load_data = json.loads(dump_data)
# 列印轉換結果
print(type(dict_data),dict_data)
print(type(dump_data),dump_data)
print(type(load_data),load_data)
執行結果:
<class 'dict'> {'a': 1, 'b': 2}
<class 'str'> {"a": 1, "b": 2}
<class 'dict'> {'a': 1, 'b': 2}
在例子中一開始的變數 dict_data 是一個字典,json.dumps() 後,將dict格式資料轉換成json格式字串。這時候雖然都是{'a': 1, 'b': 2},但是格式卻前後不一樣。隨後又通過 json.loads(),重新將json格式字串轉換成字典。
線上解析Json
在實際應用中,要提取json資料,就要了解返回json資料的結構。
可是Json格式的資料往往是這樣的。
大家別擔心,我們可以將資料複製到一些json外掛或線上解析!
比如這個外掛是小五常用的:
此時再開啟剛才的網址
是不是清晰了很多呢?
如果用python來獲取裡面的資料怎麼做的?
先利用 json.loads() 來將 Json 轉成字典,再用 get() 函式直到得到我們想要的list 物件,那麼對於 list 裡面的資料我們用個 for 迴圈就行啦~
額,有點繞。
還是文章一開始的例子,我們想獲取其中所有狗狗的名字:
{
"animals": {
"dog": [
{
"name": "Rufus",
"age":15
},
{
"name": "Marty",
"age": null
}
]
}
}
我們可以這樣做:
load_data = json.loads(dump_data)
data = load_data.get("animals").get("dog")
result1 = []
for i in data:
result1.append(i.get("name"))
print(result1)
執行結果:
['Rufus', 'Marty']
這樣確實可以獲得我們想要的結果。
PS:類似的線上解析網站也有很多,比如 https://www.json.cn。
JsonPath
不知道大家還記不記得,在一開始介紹Json時,我提到了它相對於XML來說,更加的輕量級,更方便解析。
既然 XML 人家都有 XPATH ,那麼Json有沒有類似的工具呢?
JsonPath 是一種資訊抽取類庫,是從Json文件中抽取指定資訊的工具。
JsonPath 對於 Json 來說,相當於 XPATH 對於 XML。
Json結構清晰,可讀性高,複雜度低,非常容易匹配,下表是JsonPath的用法。
沒錯,還是這個例子,我們這次嘗試用JsonPath獲取其中所有狗狗的名字:
{
"animals": {
"dog": [
{
"name": "Rufus",
"age":15
},
{
"name": "Marty",
"age": null
}
]
}
}
我們可以這樣做:
load_data = json.loads(dump_data)
jobs=load_data['animals']['dog']
result2 = []
for i in data:
# 從根節點開始,匹配name節點
result2.append(jsonpath.jsonpath(i,'$..name')[0])
print(result2)
其中 $..name 代表從根節點開始,匹配name節點
執行結果:
['Rufus', 'Marty']
利用 JsonPath 同樣可以獲得我們想要的結果。
我們在後續例項演練中將繼續採用 JsonPath 來抽取資料。
例項演練
示例:我們利用網易雲音樂評論API來生成Json資料,並從中獲取熱評資料。
http://music.163.com/api/v1/resource/comments/R_SO_4_483671599?limit=10&offset=0
在瀏覽器(已安裝Json解析外掛)中開啟:
標紅區域的資料是我們本次想要獲取的。
def get_comments(url):
data = []
doc = get_json(url)
jobs=doc['hotComments']
for job in jobs:
dic = {}
#從根節點開始,匹配content節點
dic['content']=jsonpath.jsonpath(job,'$..content')[0] #評論
dic['time']= stampToTime(jsonpath.jsonpath(job,'$..time')[0]) #時間
dic['userId']=jsonpath.jsonpath(job['user'],'$..userId')[0] #使用者ID
dic['nickname']=jsonpath.jsonpath(job['user'],'$..nickname')[0]#使用者名稱
dic['likedCount']=jsonpath.jsonpath(job,'$..likedCount')[0] #贊數
data.append(dic)
return pd.DataFrame(data)
final_result = get_comments('http://music.163.com/api/v1/resource/comments/R_SO_4_483671599?limit=10&offset=0')
(完整程式碼見文末下載地址)
執行結果:
成功獲取√
希望本文能讓大家以後玩轉Json資料更輕鬆~
本文所有案例的程式碼已上傳github:
https://github.com/zpw1995/aotodata/tree/master/interest/Json
- END -
如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。掃描下方二維碼或者微信搜尋「perfect_iscas」,新增好友後即可獲得10套程式設計師全棧課程+1000套PPT和簡歷模板,向我私聊「進群」二字即可進入高質量交流群。
↓掃描二維碼進群↓
喜歡文章,點個在看
相關文章
- EasyNLP帶你玩轉CLIP圖文檢索
- 行為驅動開發:一篇文章帶你用 Python 玩轉 BDDPython
- 一篇文章帶你使用 JSON 格式資料完成 SpringSecurity 登入JSONSpringGse
- 將json資料轉換為Python字典將json資料轉換為Python字典JSONPython
- 帶你重新“玩轉”FlutterFlutter
- Smartbi帶你一文玩轉波士頓矩陣矩陣
- 資料建模實戰,Smartbi帶你玩轉購物籃分析
- 萬字長文帶你漫遊資料結構世界資料結構
- 一文帶你玩轉設計模式之「責任鏈」設計模式
- 手摸手帶你玩轉Xcode ExtensionsXCode
- CryptAssist-帶你玩轉幣圈
- 手把手帶你玩轉LinuxLinux
- 【長文】帶你搞明白RedisRedis
- 開源 5 款超好用的資料庫 GUI 帶你玩轉 MongoDB、Redis、SQL 資料庫資料庫GUIMongoDBRedisSQL
- 淘寶雙十一之外,實在RPA帶你玩轉私域流量!
- Python JSON 使用指南:解析和轉換資料PythonJSON
- RSA 2020還在擔心運營?綠盟ADBOS帶你玩轉SOC
- 純乾貨:21天帶你玩轉容器
- 老司機帶你玩轉Radare2
- 架構師帶你玩轉分散式鎖架構分散式
- 帶你玩轉RabbitMQ的五種佇列MQ佇列
- 五萬字長文帶你學會SpringSpring
- GitHub標星3W+,80個Python案例,帶你輕鬆玩轉Python學習!GithubPython
- 資料集轉換JSONJSON
- 把JSON資料格式轉換為Python的類物件JSONPython物件
- 一文帶你搞懂資料庫事務資料庫
- 「玩轉Python」打造十萬博文爬蟲篇Python爬蟲
- 三步帶你玩轉前端裝飾器前端
- [譯] 一文帶你玩轉 Java8 Stream 流,從此操作集合 So EasyJava
- 長文:一篇"完美"的資料庫產品文件都有啥資料庫
- Python中解析json資料PythonJSON
- JSON 資料型別(轉載)JSON資料型別
- 帶你7天玩轉視覺化建站平臺視覺化
- 七天帶你玩轉MySQL之SQL語句MySql
- 【12月11日】真香現場,帶你玩轉 EKS!
- 程式設計師大殺器?帶你玩轉ChatGPT程式設計師ChatGPT
- 玩轉資料庫索引資料庫索引
- 不知道資料模型?一文帶你瞭解資料模型!模型