一篇長文帶你在python裡玩轉Json資料

千鋒Python唐小強發表於2019-11-06

一篇長文帶你在python裡玩轉Json資料

Json簡介

Json(JavaScript Object Notation)

很多網站都會用到Json格式來進行資料的傳輸和交換。

一篇長文帶你在python裡玩轉Json資料

這因為Json是一種輕量級的資料交換格式,具有資料格式簡單,讀寫方便易懂等很多優點。用它來進行前後端的資料傳輸,大大的簡化了伺服器和客戶端的開發工作量。

而且相對於XML來說,更加的輕量級,更方便解析。

今天我們講講如何在python裡玩轉Json資料?

一篇長文帶你在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 物件。

一篇長文帶你在python裡玩轉Json資料

#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格式的資料往往是這樣的。

一篇長文帶你在python裡玩轉Json資料

一篇長文帶你在python裡玩轉Json資料

大家別擔心,我們可以將資料複製到一些json外掛或線上解析!

比如這個外掛是小五常用的:

一篇長文帶你在python裡玩轉Json資料

此時再開啟剛才的網址

一篇長文帶你在python裡玩轉Json資料

是不是清晰了很多呢?

如果用python來獲取裡面的資料怎麼做的?

先利用 json.loads() 來將 Json 轉成字典,再用 get() 函式直到得到我們想要的list 物件,那麼對於 list 裡面的資料我們用個 for 迴圈就行啦~

額,有點繞。

一篇長文帶你在python裡玩轉Json資料

還是文章一開始的例子,我們想獲取其中所有狗狗的名字:

{
    "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有沒有類似的工具呢?

一篇長文帶你在python裡玩轉Json資料

JsonPath 是一種資訊抽取類庫,是從Json文件中抽取指定資訊的工具。

JsonPath 對於 Json 來說,相當於 XPATH 對於 XML。


Json結構清晰,可讀性高,複雜度低,非常容易匹配,下表是JsonPath的用法。

一篇長文帶你在python裡玩轉Json資料

一篇長文帶你在python裡玩轉Json資料

沒錯,還是這個例子,我們這次嘗試用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解析外掛)中開啟:

一篇長文帶你在python裡玩轉Json資料

一篇長文帶你在python裡玩轉Json資料

標紅區域的資料是我們本次想要獲取的。

一篇長文帶你在python裡玩轉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')

(完整程式碼見文末下載地址)

執行結果:

一篇長文帶你在python裡玩轉Json資料

成功獲取√

希望本文能讓大家以後玩轉Json資料更輕鬆~

一篇長文帶你在python裡玩轉Json資料

本文所有案例的程式碼已上傳github:

https://github.com/zpw1995/aotodata/tree/master/interest/Json

- END -

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊掃描下方二維碼或者微信搜尋「perfect_iscas」,新增好友後即可獲得10套程式設計師全棧課程+1000套PPT和簡歷模板向我私聊「進群」二字即可進入高質量交流群。

掃描二維碼進群↓

一篇長文帶你在python裡玩轉Json資料

一篇長文帶你在python裡玩轉Json資料

一篇長文帶你在python裡玩轉Json資料

在看 一篇長文帶你在python裡玩轉Json資料

相關文章