iT邦幫忙

2022 iThome 鐵人賽

0

Python 的標準函式「json」提供了操作 JSON 檔案的方法,可以針對 JSON 檔案進行讀取、寫入或修改,這篇教學將會介紹 json 常用的方法。

原文參考:JSON 檔案操作

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

JSON 檔案操作

JSON 是什麼?

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 常用方法

下方列出幾種 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 格式的資料。

import json

要使用 json 必須先 import json 模組,或使用 from 的方式,單獨 import 特定的類型。

import json
from json import load

load(fp)

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'}]
'''

loads(s)

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'}]
'''

dump(obj, fp)

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"
  ]
}

dumps(obj)

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"]}

JSONDecoder()

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']}

JSONEncoder()

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"]}

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 31 ) CSV 檔案操作
下一篇
( Day 33 ) 讀取 EXCEL 內容
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言