CodeGym /Javaコース /Python SELF JA /JSONとのやり取り

JSONとのやり取り

Python SELF JA
レベル 23 , レッスン 1
使用可能

2.1 モジュール json

JSON (JavaScript Object Notation) は、データ交換のための軽量のフォーマットで、人間が読み書きしやすく、コンピュータが解析や生成しやすいものだよ。JSONはよくサーバーとWebアプリ間でデータをやり取りするためや、設定ファイルを保存するのに使われるんだ。

Pythonのモジュール json はシリアライズ(PythonオブジェクトをJSON文字列に変換)やデシリアライズ(JSON文字列をPythonオブジェクトに変換)するための機能を提供しているんだ。このモジュールはPythonの標準ライブラリに組み込まれていて、JSONデータを扱うときによく使われるよ。

jsonモジュールの主要な関数はpickleに似ていて、同じように動作するよ。標準って感じだね!

  • 文字列とのやり取り:
    • json.dumps(obj) — PythonオブジェクトをJSON文字列に変換する。
    • json.loads(s) — JSON文字列をPythonオブジェクトに変換する。
  • ファイルとのやり取り:
    • json.dump(obj, file) — Pythonオブジェクトをシリアライズしてテキストファイルに書き込む。
    • json.load(file) — JSONフォーマットのテキストファイルからPythonオブジェクトをデシリアライズする。

これらの関数の使い方を覚えるために、いくつかの例を見てみよう。

2.2 文字列へのシリアライズ

PythonオブジェクトをJSON文字列にシリアライズする

オブジェクトを文字列にシリアライズするためには、単にそのオブジェクトをjson.dumps()に渡すだけでいいよ。


import json

# シリアライズ用のオブジェクト例
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"],
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}
            
# PythonオブジェクトをJSON文字列に変換
json_string = json.dumps(data, indent=4)
print("シリアライズされたデータ (JSON):", json_string)
        

JSON文字列のPythonオブジェクトへのデシリアライズ

文字列からオブジェクトを得るためには、オブジェクトの説明を含むJSON文字列をjson.loads()メソッドに渡すだけでいいんだ。


import json

# デシリアライズ用のJSON文字列例
json_string = '''
    {
        "name": "Alice",
        "age": 30,
        "is_student": false,
        "courses": ["Math", "Science"],
        "address": {
          "city": "New York",
          "zip_code": "10001"
        }
    }
    '''
            
# JSON文字列をPythonオブジェクトに変換
data = json.loads(json_string)
print("デシリアライズされたデータ (Python):", data)
        

2.3 ファイルへのシリアライズ

PythonオブジェクトをJSONフォーマットでファイルに書き込む

オブジェクトをファイルに書き込むにはjson.dump()メソッドを呼び出す必要があるよ。ファイルを扱う場合は、例外処理を使って、起こりうるエラーを適切に処理することが重要なんだ。以下に例を示すね:


import json

# シリアライズ用のオブジェクト例
data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Literature"],
    "address": {
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
            
# 例外処理を使用したJSONファイルへのPythonオブジェクトの書き込み
try:
    with open('data.json', 'w') as file:
        json.dump(data, file, indent=4)
    print("データがファイルに正常に書き込まれました。")
except IOError:
    print("ファイル書き込み時にエラーが発生しました。")
except json.JSONEncodeError:
    print("JSONエンコード時にエラーが発生しました。")
            
        

JSONフォーマットのファイルからPythonオブジェクトを読み込む

読み込みもとても簡単で、ファイルをjson.load()メソッドに渡すだけだよ。こちらも例外処理を使うことが重要だね:


import json

# 例外処理を使用したJSONファイルからのPythonオブジェクトの読み込み
try:
    with open('data.json', 'r') as file:
        data = json.load(file)
    print("ファイルからのデシリアライズされたデータ (Python):", data)
except IOError:
    print("ファイル読み込み時にエラーが発生しました。")
except json.JSONDecodeError:
    print("JSONデコード時にエラーが発生しました。")
        

2.4 関数の追加パラメータ

シリアライズを行う関数には、JSONをもっと読みやすくする追加のパラメータを渡すことができるんだよ:

  • skipkeys: Trueの場合、キーが文字列、数値、またはNoneでないときにスキップする。
  • ensure_ascii: Trueの場合、すべての非ASCII文字はUnicodeエスケープシーケンスでエスケープされる。
  • indent: 数値を指定すると、読みやすさのためにインデントが追加される。
  • sort_keys: Trueのとき、JSON内のキーはアルファベット順にソートされる。

json.dumps()のパラメータの使用例:


import json

data = {"c": 3, "b": 2, "a": 1}
            
# キーの並び替えとインデントを使ったシリアライズ
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
        

2.5 カスタムデコーダとエンコーダ

jsonモジュールは、オブジェクトのシリアライズとデシリアライズのためにカスタム関数を使用することができるんだ。

カスタムエンコーダの例

まず、特別なクラスエンコーダを作成して、オブジェクトのタイプがdatetimeの場合、ISO形式の文字列としてオブジェクトを返すようにチェックするんだ。


import json
from datetime import datetime
            
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)
            
data = {
    "name": "Alice",
    "timestamp": datetime.now()
}
            
# カスタムエンコーダを使ったシリアライズ
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)

カスタムデコーダの例

逆の操作には、文字列を日付に変換する関数が必要だね。例えば、フィールド名がtimestampであるか確認し、それをdatetimeオブジェクトに変換するようにすればいいんだ:


import json
from datetime import datetime
        
def custom_decoder(dct):
    if 'timestamp' in dct:
        dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
    return dct
        
json_string = '''
{
    "name": "Alice",
    "timestamp": "2023-05-15T14:30:00"
}
'''
        
# カスタムデコーダを使ったデシリアライズ
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
    
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION