目次
概要
jsonモジュールを使用してデータ変換やファイル読み書きを行う方法についてまとめた。
前提としてファイルオブジェクトの操作が必要になる。
前提(ファイル構成)
実行したファイル構成は以下となる。
│ about_json.ipynb ⇒実行ファイル
│
└─sub
sample.json ⇒JSON書き込みファイル
sample_data.json ⇒JSON読み込みファイル
sample_data.json
{
"page": 1,
"per_page": 6,
"total": 12,
"total_pages": 14,
"data": [
{
"id": 1,
"name": "cerulean",
"year": 2000,
"color": "#98B2D1",
"pantone_value": "15-4020"
},
{
"id": 2,
"name": "fuchsia rose",
"year": 2001,
"color": "#C74375",
"pantone_value": "17-2031"
}
]
}
jsonモジュールの使い方
jsonモジュールのインポート
jsonモジュールをインポートすればjsonまわりの機能について使用可能。
import json
主な関数
関数 | 説明 |
---|---|
json.dumps(データ構造) | データ構造をJSON文字列に変換します |
json.loads(JSON文字列) | JSON文字列をデータ構造に変換します |
json.dump(データ構造, ファイルオブジェクト) | データ構造をJSON文字列としてファイルに保存します |
json.load(ファイルオブジェクト) | ファイルからJSONの文字列を読み込み、データ構造に変換します |
json.dumps()
json.dumps()は、リストや辞書などのデータ構造をJSON文字列に変換する。
import json
sample_list = ["りんご", "ごりら", "らっぱ"]
res1 = json.dumps(sample_list)
print(f"{res1=}")
# --------------------------------------
# 出力
#res1='["\\u308a\\u3093\\u3054", "\\u3054\\u308a\\u3089", "\\u3089\\u3063\\u3071"]'
# 日本語の場合、Unicodeエスケープ(シーケンス)という形式
sample_dir = {
1: "apple",
2: "tomato",
3: "banana"
}
res2 = json.dumps(sample_dir)
print(f"{res2=}")
# --------------------------------------
# 出力
#res2='{"1": "apple", "2": "tomato", "3": "banana"}'
日本語の場合、Unicodeエスケープ(シーケンス)という形式に変換されてしまう。
日本語を表示させる方法
json.dumps()の引数に「ensure_ascii=False」を設定する。
import json
sample_list = ["りんご", "ごりら", "らっぱ"]
res1 = json.dumps(sample_list, ensure_ascii=False)
print(f"{res1 = }")
# --------------------------------------
# 出力
#res1='["りんご", "ごりら", "らっぱ"]'
json.loads()
json.loads()は、JSON文字列をリストや辞書などのデータ構造に変換する。
import json
data1 = '["りんご", "ごりら", "らっぱ"]'
res1 = json.loads(data1)
print(f"{res1=}", type(res1))
# --------------------------------------
# 出力
#res1=['りんご', 'ごりら', 'らっぱ'] <class 'list'>
data2 = '{"1": "apple", "2": "tomato", "3": "banana"}'
res2 = json.loads(data2)
print(f"{res2=}", type(res2))
# --------------------------------------
# 出力
#res2={'1': 'apple', '2': 'tomato', '3': 'banana'} <class 'dict'>
json.dump()
json.dump()は、データ構造をJSON文字列としてファイルに保存する。
以下はsub\sample.jsonにリストをJSON文字列として保存する方法。
import json
import os
sample_list = ["りんご", "ごりら", "らっぱ"]
path = os.path.join("sub", "sample.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(sample_list, f)
# --------------------------------------
# 結果
#["\u308a\u3093\u3054", "\u3054\u308a\u3089", "\u3089\u3063\u3071"]
ファイルに保存する際にも日本語を保存する場合は注意。
日本語として保存する場合は、先ほどと同様に「ensure_ascii=False」を設定する。
import json
import os
sample_list = ["りんご", "ごりら", "らっぱ"]
path = os.path.join("sub", "sample.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(sample_list, f, ensure_ascii=False)
# --------------------------------------
# 結果
#["りんご", "ごりら", "らっぱ"]
JSON文字列を整形して保存
JSON文字列を整形した形で保存する場合、以下のように「indent」を設定する。
import json
import os
sample_list = ["りんご", "ごりら", "らっぱ"]
path = os.path.join("sub", "sample.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(sample_list, f, ensure_ascii=False, indent=2)
# --------------------------------------
# 結果
#[
# "りんご",
# "ごりら",
# "らっぱ"
#]
辞書についても以下のようにJSON文字列に変換して保存できる。
import json
import os
sample_dir = {
1: "apple",
2: "tomato",
3: "banana"
}
path = os.path.join("sub", "sample.json")
with open(path, "w", encoding="utf-8") as f:
json.dump(sample_dir, f, indent=2)
# --------------------------------------
# 結果
#{
# "1": "apple",
# "2": "tomato",
# "3": "banana"
#}
json.load()
json.load()は、ファイルからJSON文字列を読み込んでデータ構造に変換する。
import json
import os
path = os.path.join("sub", "sample_data.json")
with open(path, encoding="utf-8") as f:
res = json.load(f)
print(res)
print(type(res))
# --------------------------------------
# 出力
#{'page': 1, 'per_page': 6, 'total': 12, 'total_pages': 14, 'data': [{'id': 1, 'name': 'cerulean', 'year': 2000, 'color': '#98B2D1', 'pantone_value': '15-4020'}, {'id': 2, 'name': 'fuchsia rose', 'year': 2001, 'color': '#C74375', 'pantone_value': '17-2031'}]}
#<class 'dict'>
JSON文字列を整形して出力
import json
import os
path = os.path.join("sub", "sample_data.json")
with open(path, encoding="utf-8") as f:
res = json.load(f)
print(json.dumps(res, indent=2))
# --------------------------------------
# 結果
#{
# "page": 1,
# "per_page": 6,
# "total": 12,
# "total_pages": 14,
# "data": [
# {
# "id": 1,
# "name": "cerulean",
# "year": 2000,
# "color": "#98B2D1",
# "pantone_value": "15-4020"
# },
# {
# "id": 2,
# "name": "fuchsia rose",
# "year": 2001,
# "color": "#C74375",
# "pantone_value": "17-2031"
# }
# ]
#}
その他JSON文字列の特徴
JSON文字列のキーは文字列。
数値などを指定すると、loadメソッドでエラーになる。
また、値は数値でも設定可能だがloadメソッドで取得すると文字列になる。