介紹如何在 Python 中使用內建的 json 模組,讀取、解析、產生與寫入 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 的類型
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone

解析 JSON 字串資料

如果在 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() 是從檔案讀取資料。

寫入 JSON 檔案

若要將 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 的類型
dictobject
list, tuplearray
strstring
int, float, int- & float-derived Enumsnumber
Truetrue
Falsefalse
Nonenull

轉為 JSON 字串資料

若要將 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
}

參考資料