Python 的標準函式「json」提供了操作 JSON 檔案的方法,可以針對 JSON 檔案進行讀取、寫入或修改,這篇教學將會介紹 json 常用的方法。
原文參考:JSON 檔案操作
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

JSON ( JavaScript Object Notation ) 是一種使用結構化資料呈現 JavaScript 物件的標準格式,也是相當普及的輕量級資料交換格式 ( JSON 本質只是純文字格式 ),幾乎所有與網路開發相關的語言都有處理 JSON 的函式庫。
JSON 由「鍵」和「值」組成,可以在 JSON 裡加入各種資料類型 ( 字串、數字、陣列、布林值、物件、空值...等 ),下方是一個簡單的 JSON 檔案:
注意!標准 JSON 必須使用雙引號 ( " ) 而不能使用單引號 ( ' ),否則在轉換成 dict 型別時會發生錯誤。
{
  "name": "oxxo",
  "sex": "male",
  "age": 18,
  "phone": [
    {
      "type": "home",
      "number": "07 1234567"
    },
    {
      "type": "office",
      "number": "07 7654321"
    }
  ]
}
下方列出幾種 json 模組常用的方法 ( 參考 Python 官方文件:json ):
| 方法 | 參數 | 說明 | 
|---|---|---|
| load() | fp | 讀取本機 JSON 檔案,並轉換為 Python 的字典 dict 型別。 | 
| loads() | s | 將 JSON 格式的資料,轉換為 Python 的字典 dict 型別。 | 
| dump() | obj, fp | 將字典 dict 型別的資料,寫入本機 JSON 檔案。 | 
| dumps() | obj | 將字典 dict 型別的資料轉換為 JSON 格式的資料。 | 
| JSONDecoder() | 將 JSON 格式的資料,轉換為 Python 的字典 dict 型別。 | |
| JSONEncoder() | 將字典 dict 型別的資料轉換為 JSON 格式的資料。 | 
要使用 json 必須先 import json 模組,或使用 from 的方式,單獨 import 特定的類型。
import json
from json import load
- JSON 檔案操作時,需要使用 open() 開啟,詳細資訊可以參考:內建函式 ( 檔案讀寫 open )。
 - 本篇教學可使用 JSON 範例檔:JSON 檔案下載
 
json.load(fp) 會讀取本機 JSON 檔案,並轉換為 Python 的字典 dict 型別,J資料在轉換時,會按照下列表格的規則,轉換為 Python 資料格式:
| JSON | Python | 
|---|---|
| object 物件 | dict 字典 | 
| array 陣列 | list 串列 | 
| string 文字/字串 | str 文字/字串 | 
| number(int) 整數數字 | int 整數 | 
| number(real) 浮點數字 | float 浮點數 | 
| true | True | 
| false | False | 
| null | None | 
下方的程式碼,會先 open 範例的 json 檔案 ( 模式使用 r ),接著使用 json.load 讀取該檔案轉換為 dict 型別,最後使用 for 迴圈將內容印出。
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','r')
a = json.load(jsonFile)
for i in a:
    print(i, a[i])
'''
name oxxo
sex male
age 18
phone [{'type': 'home', 'number': '07 1234567'}, {'type': 'office', 'number': '07 7654321'}]
'''
json.loads(s) 能將 JSON 格式的資料,轉換為 Python 的字典 dict 型別,下方的例子,同樣會先 open 範例的 json 檔案 ( 模式使用 r ),接著使用 json.load 讀取該檔案轉換為 dict 型別,最後使用 for 迴圈將內容印出 ( 用法上與 load 不太相同,load 讀取的是檔案,loads 是讀取的是資料 )。
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','r')
f =  jsonFile.read()   # 要先使用 read 讀取檔案
a = json.loads(f)      # 再使用 loads
for i in a:
    print(i, a[i])
'''
name oxxo
sex male
age 18
phone [{'type': 'home', 'number': '07 1234567'}, {'type': 'office', 'number': '07 7654321'}]
'''
json.dump(obj, fp) 能將字典 dict 型別的資料轉換成 JSON 格式,寫入本機 JSON 檔案,資料在轉換時,會按照下列表格的規則,轉換為 JSON 資料格式。
| Python | JSON | 
|---|---|
| dict 字典 | object 物件 | 
| list 陣列、tuple 元組/數組 | array 陣列 | 
| str 文字/字串 | string 文字/字串 | 
| int, float 各種數字 | number 數字 | 
| True | true | 
| False | false | 
| None | null | 
下方的程式碼,會先 open 範例的 json 檔案 ( 模式使用 w ),接著編輯一個 data 的字典資料,完成後使用 dump 的方式將資料寫入 json 檔案中。
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','w')
data = {}
data['name'] = 'oxxo'
data['age'] = 18
data['eat'] = ['apple','orange']
json.dump(data, jsonFile)
寫入之後 JSON 檔案的內容:
{"name": "oxxo", "age": 18, "eat": ["apple", "orange"]}
如果設定「indent」可以將寫入的資料進行縮排的排版。
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','w')
data = {}
data['name'] = 'oxxo'
data['age'] = 18
data['eat'] = ['apple','orange']
json.dump(data, jsonFile, indent=2)
寫入之後 JSON 檔案的內容:
{
  "name": "oxxo",
  "age": 18,
  "eat": [
    "apple",
    "orange"
  ]
}
json.dumps(obj) 能將字典 dict 型別的資料轉換為 JSON 格式的資料,下方的例子,同樣會先 open 範例的 json 檔案 ( 模式使用 w ),接著使用 json.dumps 將 dict 字典的資料轉換為 JSON 格式,最後使用 write 將資料寫入 ( 用法上與 dump 不太相同,dump 轉換資料並寫入檔案,dumps 只是轉換資料 )。
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','w')
data = {}
data['name'] = 'oxxo'
data['age'] = 18
data['eat'] = ['apple','orange']
w = json.dumps(data)     # 產生要寫入的資料
jsonFile.write(w)        # 寫入資料
jsonFile.close()
寫入之後 JSON 檔案的內容:
{"name": "oxxo", "age": 18, "eat": ["apple", "orange"]}
然而 dumps 也可以單純作為轉換格式使用,
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','r')
data = {}
data['name'] = 'oxxo'
data['age'] = 18
data['eat'] = ['apple','orange']
w = json.dumps(data)
print(w)
# {"name": "oxxo", "age": 18, "eat": ["apple", "orange"]}
json.JSONDecoder() 會將 JSON 格式的資料,轉換為 Python 的字典 dict 型別 ( json.load 和 json.loads 預設會使用 json.JSONDecoder() )。
import json
jsonFile = open('/content/drive/MyDrive/Colab Notebooks/json-demo.json','r')
data = jsonFile.read()
r = json.JSONDecoder().decode(data)
print(r)
# {'name': 'oxxo', 'age': 18, 'eat': ['apple', 'orange']}
json.JSONEncoder() 會將字典 dict 型別的資料轉換為 JSON 格式的資料 ( json.dump 和 json.dumps 預設會使用 json.JSONEncoder() )。
import json
data = {}
data['name'] = 'oxxo'
data['age'] = 18
data['eat'] = ['apple','orange']
w = json.JSONEncoder().encode(data)    # 使用 JSONEncoder() 的 encode 方法
print(w)
# {"name": "oxxo", "age": 18, "eat": ["apple", "orange"]}
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^