この記事では、Pythonでオブジェクトを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 |
もし、上記以外の型を変換したい場合は、サブクラスを作って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.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モジュールを使うことでさまざまな型をファイルに読み書きすることができます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ