【json】Pythonでファイル操作:jsonモジュールの基本的な使用方法

概要

jsonモジュールを使用してデータ変換やファイル読み書きを行う方法についてまとめた。
前提としてファイルオブジェクトの操作が必要になる。


あわせて読みたい

概要 open関数を使用してファイルの読み書きを行う方法について紹介する。   ファイル操作まわりの前提 以下のディレクトリ構造でjupyter-labを使用している。 […]

【open】Pythonでファイル操作:openモジュールの基本的な使用方法

あわせて読みたい

概要 osモジュールを使用すると、とOSに依存する機能を可能な限り同一の書き方で同一の機能を利用可能。OSに依存するケースとしては例えば以下がある。 ・Windows:'\'・Linux:'/' 上記のよう[…]

【os】Pythonでファイル操作:osモジュールの基本的な使用方法

 

前提(ファイル構成)

実行したファイル構成は以下となる。

│ 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メソッドで取得すると文字列になる。

 

スポンサーリンク