Python 處理 JSON 數據資料

Python 處理 JSON 數據資料

大綱

前言

JSON 資料在 Python 存在的方式是 "字串" 格式,使用 json 模組將資料轉成JSON字串或是JSON檔案。

JSON in Python

Python 有一個名為 json 的內置套件包,可用於處理 JSON 數據。

import json

json.loads() - 將JSON資料 載入 Python

使用 json.loads() 方法,將 JSON 資料 載入 Python,下列是轉換表:

----- JSON資料 ----- ----- Python資料 -----
object dict
array list
string unicode
number(int) int, long
number(real) float
true True
false False
null None

範例 pythonJson-01.py :  注意,JSON資料須加上 '' 單引號,因為JSON資料再Python中是以字串形式存在的。

# pythonJson-01.py
import json

jsonObj = '{"b":80, "a":25, "c":60}'    # json物件
dictObj = json.loads(jsonObj)           # 轉成Python物件
print(dictObj)
print(type(dictObj))

執行結果

{'b': 80, 'a': 25, 'c': 60}
<class 'dict'>

範例 pythonJson-02.py :

# pythonJson-02.py
import json

x = '{ "name":"John", "age":30, "city":"New York"}' # some JSON:
y = json.loads(x) # parse x:
print(y["age"]) # the result is a Python dictionary:

執行結果

30
<class 'str'>

範例 pythonJson-03.py : 使用多層次JSON物件,在 父JSON物件"Asia"下建立兩個  子JSON物件 "Japan"、"China"。

# pythonJson-03.py
import json

obj = '{"Asia":[{"Japan":"Tokyo"},{"China":"Beijing"}]}'
json_obj = json.loads(obj)
print(json_obj)
print(type(json_obj))
print(json_obj["Asia"])
print(json_obj["Asia"][0])
print(json_obj["Asia"][1])
print(json_obj["Asia"][0]["Japan"])
print(json_obj["Asia"][1]["China"])

執行結果

{'Asia': [{'Japan': 'Tokyo'}, {'China': 'Beijing'}]}
<class 'dict'>
[{'Japan': 'Tokyo'}, {'China': 'Beijing'}]
{'Japan': 'Tokyo'}
{'China': 'Beijing'}
Tokyo
Beijing

json.dumps()  - 將Python資料 導出 為JSON字串

如果您有 Python 物件,則可以使用 json.dumps() 方法將 Python 資料 導出 為 JSON 字串,下列是轉換表:

------Python資料------- ------JSON資料-------
dict Object
list, tuple Array
str, unicode String
int, float, long Number
True true
False false
None null

範例 pythonJson-04.py : 將 Python 串列與元組資料轉換成JSON陣列資料

# pythonJson-04.py
import json

listNumbers = [5, 10, 20, 1]            # 串列資料
tupleNumbers = (1, 5, 10, 9)            # 元組資料
jsonData1 = json.dumps(listNumbers)     # 將串列資料轉成json資料
jsonData2 = json.dumps(tupleNumbers)    # 將串列資料轉成json資料
print("串列轉換成json的陣列", jsonData1)
print("元組轉換成json的陣列", jsonData2)
print("json陣列在Python的資料類型 ", type(jsonData1))直

執行結果

串列轉換成json的陣列 [5, 10, 20, 1]
元組轉換成json的陣列 [1, 5, 10, 9]
json陣列在Python的資料類型 <class 'str'>

範例 pythonJson-05.py :  json.dumps() 方法,使用參數: sort_keysident

# pythonJson-05.py
import json

players = {'Stephen Curry':'Golden State Warriors',
           'Kevin Durant':'Golden State Warriors',
           'Lebron James':'Cleveland Cavaliers',
          }
jsonObj = json.dumps(players, sort_keys=True, indent=4)   
print(jsonObj)
print(type(jsonObj))

執行結果

{
"Kevin Durant": "Golden State Warriors",
"Lebron James": "Cleveland Cavaliers",
"Stephen Curry": "Golden State Warriors"
}
<class 'str'>

利用dump()與load()存取JSON檔案

利用 dump() 將Python資料儲存為JSON檔案

這邊要特別注意,用來存取JSON檔案的函數名稱是叫作 dump() load(),函數名稱後面沒有加s,在 python 內將 python 資料與以字串呈現的 JSON 格式轉換的函數名稱是叫作 dumps()loads(),函數名稱後面有加s。

在Python中讀/寫檔的語法為 with...open

範例 pythonJson-06.py : 將一個基本型態的Python字典資料 dictObj ,使用 dump(),將其儲存為檔案 output-pythonJson-06.jsondump() 第一個參數 dictObj 是資料來源,第二個參數 fileObj 是檔案物件。 在工作附錄中會產生一個檔案 output-pythonJson-06.json,可使用筆記本打開。

# pythonJson-06.py
import json

dictObj = {'b':80, 'a':25, 'c':60}  # 字典資料   
fileName = 'output-pythonJson-06.json'  # 輸出檔案
with open(fileName, 'w') as fileObj:    # 開啟檔案物件
    json.dump(dictObj, fileObj)  # 將字典資料儲存為檔案 

執行結果

{"b": 80, "a": 25, "c": 60}

範例 pythonJson-07.py : 將一個2層次的JSON陣列的Python字典資料 dictObj ,使用 dump(),將其儲存為檔案 output-pythonJson-06.jsondump() 第一個參數 dictObj 是資料來源,第二個參數 fileObj 是檔案物件。 在工作附錄中會產生一個檔案 output-pythonJson-07.json,可使用筆記本打開。

# pythonJson-07.py
import json

dictObj = {"Asia":
        [{"Japan":"Tokyo"},
         {"China":"Beijing"}],
        "Europe":
        [{"UK":"London"},
         {"France":"Paris"}]
      }
fileName = 'output-pythonJson-07.json'
with open(fileName, 'w') as fileObj:
    json.dump(dictObj, fileObj)   

執行結果

{"Asia": [{"Japan": "Tokyo"}, {"China": "Beijing"}], "Europe": [{"UK": "London"}, {"France": "Paris"}]}

範例 pythonJson-08.py : 儲存資料為一個包含中文字的串列物件 objList ,在工作附錄中會產生一個檔案 output-pythonJson-08.json,可使用筆記本打開。若打開時會看到中文字 "日本" 顯示為16進位碼 "\u65e5\u672c"....等。

# pythonJson-08.py
import json

objList = [{"日本":"Japan", "首都":"Tykyo"},
           {"美州":"USA", "首都":"Washington"}]
fileName = 'output-pythonJson-08.json'
with open(fileName, 'w') as fileObj:
    json.dump(objList, fileObj)

執行結果

[{"\u65e5\u672c": "Japan", "\u9996\u90fd": "Tykyo"}, {"\u7f8e\u5dde": "USA", "\u9996\u90fd": "Washington"}]

範例 pythonJson-09.py : 儲存資料為一個包含中文字的串列物件 objList。改善範例 pythonJson-08.py ,使用編碼方式 encoding='utf-8' 創建一個檔案物件,存檔時搭配 ensure_ascii=False

# pythonJson-09.py
import json

objList = [{"日本":"Japan", "首都":"Tykyo"},
           {"美州":"USA", "首都":"Washington"}]

fileName = 'output-pythonJson-09.json'
with open(fileName, 'w', encoding='utf-8') as fileObj:
    json.dump(objList, fileObj, indent=2, ensure_ascii=False)

執行結果

[ { "日本": "Japan", "首都": "Tykyo" }, { "美州": "USA", "首都": "Washington" } ]

利用 load() 讀取JSON檔案

範例 pythonJson-10.py : 讀取檔案 'output-pythonJson-07.json' 並列出結果。

# pythonJson-10.py
import json
      
fileName = 'output-pythonJson-07.json'
with open(fileName, 'r') as fileObj:
    data = json.load(fileObj)

print(data)
print(type(data))

執行結果

{'Asia': [{'Japan': 'Tokyo'}, {'China': 'Beijing'}], 'Europe': [{'UK': 'London'}, {'France': 'Paris'}]}
<class 'dict'>

範例 pythonJson-11.py : 執行程式時,會要求輸入帳號,同時會將帳號存檔為 "login.json",然後會印出 " __帳號__! 歡迎回來使用本系統! "。

# pythonJson-11.py
import json

fileName = 'login.json'
login = input("請輸入帳號 : ")
with open(fileName, 'w') as fileObj:
    json.dump(login, fileObj)
    print("%s! 歡迎使用本系統! " % login)

執行結果

請輸入帳號 : aron
aron! 歡迎使用本系統!

範例 pythonJson-12.py : 延續 範例 pythonJson-11.py ,讀取檔案 'login.json' 並印出 "__帳號__ ! 歡迎回來使用本系統! "

# pythonJson-12.py
import json

fileName = 'login.json'
with open(fileName, 'r') as fileObj:
    login = json.load(fileObj)
    print("%s! 歡迎回來使用本系統! " % login)

執行結果

請輸入帳號 : aron
aron! 歡迎回來使用本系統!

範例 pythonJson-13.py : 登入系統,若 登入檔案 'login1_13.json' 不存在,要求 "請輸入帳號 : ",若 登入檔案 'login1_13.json' 已存在,則顯示歡迎回來。

# pythonJson-13.py
import json

fileName = 'login.json'
try:
    with open(fileName) as fileObj:
        login = json.load(fileObj)   
except Exception:
    login = input("請輸入帳號 : ") 
    with open(fileName, 'w') as fileObj:
        json.dump(login, fileObj)
        print("系統已經記錄你的帳號!")
else:
    print("%s 歡迎回來!" % login)

執行結果

aron 歡迎回來!

參考資料

特色、摘要,Feature、Summary:

關鍵字、標籤,Keyword、Tag:

  • Programming-Language,Json,Python,Data-Model,Python-Tutorial,

留言

這個網誌中的熱門文章

Ubuntu 常用指令、分類與簡介

iptables的觀念與使用

網路設定必要參數IP、netmask(遮罩)、Gateway(閘道)、DNS

了解、分析登錄檔 - log

Python 與SQLite 資料庫

Blogger文章排版範本

Pandas 模組

如何撰寫Shell Script

查詢指令或設定 -Linux 線上手冊 - man

下載網頁使用 requests 模組