Categories: Python

【Python】オブジェクトをJSON文字列に変換してファイルに読み書きする方法

この記事では、PythonでオブジェクトをJSON文字列に変換(エンコード)してファイルに読み書きする方法を解説します。

辞書やリストなどのオブジェクトをファイルに読み書きできるので便利です。

それでは、JSON文字列に変換する方法を見ていきましょう!

JSON文字列にエンコード

オブジェクトをJSON文字列にエンコードするにはjson.dumps()を使います。

import json

# データ
data = [1, 2, 3]

# エンコード
encode_data = json.dumps(data)
print(f'型: {type(encode_data)}, 値: {encode_data}')

実行結果

型: <class 'str'>, 値: [1, 2, 3]

JSON文字列にエンコードする際は、以下の変換表を元にエンコードされます。

Python JSON
dict object
list, tuple array
str string
int, float, intやfloatの派生列挙型 number
True true
False false
None null
辞書をエンコードした際、keyは必ず文字列に変換されてしまいます。なので、デコードした際に全く同じ辞書には戻らない可能性があります。

もし、上記以外の型を変換したい場合は、サブクラスを作ってdefault()メソッドを実装する必要がある。→ default() - json --- JSON エンコーダおよびデコーダ — Python ドキュメント

インデント

indent引数を指定することでインデントを指定することができます。辞書をエンコードした時に指定することで見やすく整形できます。

import json

# データ
data = {'a': 1, 'b': 2, 'c': 3}

# エンコード
encode_data = json.dumps(data, indent=4)
print(encode_data)

実行結果

{
    "a": 1,
    "b": 2,
    "c": 3
}

セパレーター

separators引数では、リストや辞書のセパレーターを指定することができます。指定する際は、(item_separator, key_separator)という形のタプルを使います。

import json

# データ
data = {'a': 1, 'b': 2, 'c': 3}

# エンコード
encode_data = json.dumps(data, separators=(',',':'))
print(encode_data)

実行結果

{"a":1,"b":2,"c":3}

keyとvalueの間に表示されるセパレーターの空白を削除したのでギチギチに表示されました。

ソート

sort_keys引数にTrueを指定することで辞書がkeyによってソートされます。

import json

# データ
data = {'b': 1, 'c': 2, 'a': 3}

# エンコード
encode_data = json.dumps(data, sort_keys=True)
print(encode_data)

実行結果

{"a": 3, "b": 1, "c": 2}

JSON文字列をデコード

JSON文字列をオブジェクトにエンコードするには、json.loads()を使います。

import json

# データ
data = {'a': 1, 'b': 2, 'c': 3}

# エンコード
encode_data = json.dumps(data)
print(f'型: {type(encode_data)}, 値: {encode_data}')

# デコード
decode_data = json.loads(encode_data)
print(f'型: {type(decode_data)}, 値: {decode_data}')

実行結果

型: <class 'str'>, 値: {"a": 1, "b": 2, "c": 3}
型: <class 'dict'>, 値: {'a': 1, 'b': 2, 'c': 3}

JSON文字列をデコードする際は、以下の変換表を元にデコードされます。

JSON Python
object dict
array list
string str
number(int) int
number(real) float
true True
false False
null None

ファイルに読み書き

ファイルにJSON文字列を書き込むにはjson.dump()を使います。

json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

オブジェクトをエンコードした結果を引数に指定したファイルに書き込んでくれます。

import json

# 書き込むデータ
data = {'name': 'Mike', 'age': 22}

# ファイルに書き込む
with open('data.json', 'w') as f:
    json.dump(data, f)

data.json

{"name": "Mike", "age": 22}

JSON文字列をファイルから読み込むにはjson.load()を使います。

json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

指定したファイルを読み込みオブジェクトにデコードします。試しに先ほど作成したJSONファイルをデコードしてみます。

import json

with open('data.json', 'r') as f:
    decode_data = json.load(f)

print(f'型: {type(decode_data)}, 値: {decode_data}')

実行結果

型: <class 'dict'>, 値: {"name": "Mike", "age": 22}

ひらがなや漢字をJSON文字列に変換すると文字コードに変換されてしまうので注意。

import json

# データ
data = {'日本語': 'あイ右'}

# ファイルに書き込む
with open('data.json', 'w') as f:
    json.dump(data, f)

data.json

{"\u65e5\u672c\u8a9e": "\u3042\u30a4\u53f3"}

まとめ

この記事では、オブジェクトをJSON文字列にエンコードする方法とデコードする方法を解説しました。

オブジェクトをJSON文字列に変換することでファイルに読み書きできて便利です。またJSONは、Python以外でも広く使われているので相互運用する際にも使えます。

逆にPythonでしか使用しない場合は、pickleモジュールを使うことでさまざまな型をファイルに読み書きすることができます。

【Python】いろんな型のオブジェクトをファイルに読み書きする方法この記事では、Pythonのオブジェクトをファイルに読み書きする方法を解説します。pickleモジュールを使うことでリストや辞書などのオブジェクトをファイルに書き込み、書き込んだ型のまま再度読み込むことができます。...

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago