介紹如何在 Python 中使用內建的 json
模組,讀取、解析、產生與寫入 JSON 格式資料。
假設我們有一個 JSON 檔案 data.json
,其內容如下:
{ "name": "Jason", "age": 21, "skill": ["Python", "C/C++"], "married": false }
如果要在 Python 中讀取 data.json
這個 JSON 檔案,可以使用 Python 內建 json
模組中的 load()
函數:
import json # 開啟 JSON 檔案 with open("data.json") as f: # 讀取 JSON 檔案 p = json.load(f) # 查看整個 JSON 資料解析後的結果 print("p =", p) # 取得 name 的值 print("name =", p["name"]) # 取得 skill 的值 print("skill =", p["skill"])
p = {'name': 'Jason', 'age': 21, 'skill': ['Python', 'C/C++'], 'married': False} name = Jason skill = ['Python', 'C/C++']
load()
函數預設會使用 json.JSONDecoder()
依照以下的對應方式將 JSON 資料轉為 Python 內部的資料格式:
原始 JSON 類型 | 轉為 Python 的類型 |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
如果在 Python 中要直接解析字串中的 JSON 資料,可以使用 json
模組的 loads()
函數:
import json # JSON 字串資料 jsonStr = '{"name": "Jason", "age": 21, "skill": ["Python", "C/C++"], "married": false}' # 解析 JSON 字串資料 p = json.loads(jsonStr) # 查看整個 JSON 資料解析後的結果 print("p =", p) # 取得 name 的值 print("name =", p["name"]) # 取得 skill 的值 print("skill =", p["skill"])
p = {'name': 'Jason', 'age': 21, 'skill': ['Python', 'C/C++'], 'married': False} name = Jason skill = ['Python', 'C/C++']
loads()
函數的效果跟 load()
函數相同,只不過 loads
的資料來源是字串,而 load()
是從檔案讀取資料。
若要將 Python 中的各種資料轉為 JSON 格式並儲存至 JSON 檔案中,可以使用 dump()
函數:
import json # Python 的 dict 類型資料 myDict = { "name": "Jason", "age": 21, "skill": ["Python", "C/C++"], "married": False } # 將 Python 資料轉為 JSON 格式,儲存至 output.json 檔案 with open("output.json", "w") as f: json.dump(myDict, f, indent = 4)
這裡產生的 output.json
檔案內容為:
{ "name": "Jason", "age": 21, "skill": [ "Python", "C/C++" ], "married": false }
dump()
函數預設會使用 json.JSONEncoder()
依照以下的對應方式將 Python 內部的資料轉為 JSON 格式的資料:
原始 Python 類型 | 轉為 JSON 的類型 |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
若要將 Python 中的各種資料轉為 JSON 格式的字串,可以改用 dumps()
函數:
import json # Python 的 dict 類型資料 myDict = { "name": "Jason", "age": 21, "skill": ["Python", "C/C++"], "married": False } # 將 Python 資料轉為 JSON 格式的字串 print(json.dumps(myDict))
{"name": "Jason", "age": 21, "skill": ["Python", "C/C++"], "married": false}
若需要加上排版以方便閱讀,可以使用 indent
參數指定縮排長度:
# 加入排版 print(json.dumps(myDict, indent = 4))
{ "name": "Jason", "age": 21, "skill": [ "Python", "C/C++" ], "married": false }