Python_jsonファイルの扱い

Python_jsonデータの扱い方


Pythonではjsonモジュールをimportすることで、jsonデータを容易に扱うことができます。

また、json形式とPythonのリストや辞書形式は親和性が高いので、入出力用の変換処理がほぼ必要ありません。


JSON ファイルの読み込み

JSON ファイルを読み込みファイルとして開いてjson.load 関数で読み込むと、辞書型でデータが保存されます。

要素へのアクセスも辞書型データとしてアクセスすることができます。



import json

def read_json_file(json_file):
    try:
        with open(json_file, mode='r', encoding="utf-8") as fd:
            return json.load(fd)
    except Exception as e:
        print(e.args)
        return json.loads("{}")


if __name__ == "__main__":
    json_data = read_json_file("./conf.json")
    print(json_data["system"]["username"])

JSON ファイルへの書き込み

ファイルへの書き込みは json モジュールの dump 関数を使います。



import json

def write_json_file(json_dict, filepath):
    try:
        with open(filepath, mode='w', encoding='utf-8') as fd:
            json.dump(json_dict, fd)
        return True
    except Exception as e:
        print(e.args)
        return False


if __name__ == "__main__":
    dic = {}
    dic["key1"] = "value1"
    dic["key2"] = []
    dic["key2"].append({"key3": "value3"})
    dic["key2"].append({"key4": "value4"})
    write_json_file(dic, "./output.json")

整形して出力する

dump()にはJSONデータをインデントと改行を加えて見やすく整形するためのオプションが用意されています。



with open(filepath, mode='w', encoding='utf-8') as fd:
    json.dump(json_data, fd, indent=4, ensure_ascii=False,
        sort_keys=True, separators=(',', ': '))


JSON データの変換


辞書型から文字列型

辞書型から JSON 形式の文字列への変換は json.dumps() 関数を使います。



def json_to_str(json_dict):
    json_str = json.dumps(json_dict)
    print(json_str)

文字列型から辞書型

JSON 形式の文字列を辞書型に変換するには json.loads() 関数を使います。



def str_to_json(json_str):
    json_dict = json.loads(json_str)
    print(json_dict)

datetime型を含むJSONデータ

datetime型を含むディクショナリ型を出力するにはエンコーダを拡張する関数を呼び出す必要があります。

JSONにはdatetime型が定義されていないため、


import json
from datetime import datetime

def serialize_json_date(obj):
    if isinstance(obj, datetime):
        # return obj.isoformat()
        # 下記のように整形することも可能。
        return obj.strftime("%Y-%m-%d %H:%M:%S")
    raise TypeError ("Type %s not serializable" % type(obj))

if __name__ == "__main__":
    dic = {"now": datetime.now()}
    json_str = json.dumps(dic, default=serialize_json_date)
    print(json_str)


関連ページ