python json 試験対策 徹底的に調べてみたよ
jsonモジュールについて
jsonモジュールは、PythonのデータをJSON形式の文字列に変換したり、JSON形式の文字列をPythonのデータに変換したりするためのモジュールで
す。
pythonでのjsonファイルの使い所
アプリの設定ファイルとしてjsonファイルを使うこともあります。
あとはWeb系か。APIとかね。
jsonモジュールの主な関数 jsonモジュールには、次の関数があります。
json.loads():JSON形式の文字列をPythonのデータに変換する関数
json.dumps():PythonのデータをJSON形式の文字列に変換する関数
json.load():JSON形式のファイルをPythonのデータに変換する関数
json.dump():PythonのデータをJSON形式のファイルに変換する関数
json.loads(), json.dumps()のsはstringのsです。...ほんとか? 詳しくは知らないですが、そう覚えとけば試験対策としては問題ないと思います。 別に開発しててdumpsのsはなんでしょう?とか知らなくても開発できるし・・・
json.loads()関数
import json
# JSON形式の文字列
json_str = '{"name": "Yamada", "age": 25, "is_student": false}'
# JSON形式の文字列をPythonのデータに変換
data = json.loads(json_str)
print(data)
# 出力例:{'name': 'Yamada', 'age': 25, 'is_student': False}
print(type(data))
# 出力例:<class 'dict'>
注意すべきところはjsonではFalseは小文字で書く必要があるということです。 また、Trueも同様に小文字で書く必要があります。 試しに大文字で書いてみるとエラーが出るので、注意してください。
try:
json_str = '{"name": "Yamada", "age": 25, "is_student": False}'
data = json.loads(json_str)
print(data)
except json.JSONDecodeError as e:
print(e)
# 出力例:Expecting value: line 1 column 40 (char 39)
optionについて
import json
# JSON形式の文字列
json_str = '{"name": "Yamada", "age": 25, "is_student": false, "score": null}'
# json.loads()の全オプションを使ってみる
data = json.loads(
json_str,
cls=None, # デフォルトのJSONDecoderを使用
object_hook=None, # デコード後にカスタムオブジェクトとして変換
parse_float=float, # float型に変換する関数(デフォルトはfloat)
parse_int=int, # int型に変換する関数(デフォルトはint)
parse_constant=None, # 無効な値(inf, NaNなど)に対する処理
object_pairs_hook=None, # 順序付き辞書として変換
strict=True # 不正な形式のJSONを許さない
)
各オプションの解説
cls=None:
このオプションはカスタムデコーダーを指定するためのものです。通常はデフォルトのjson.JSONDecoderを使用しますが、カスタムデコーダークラスを指定すると独自のデコード処理を行うことができます。 使用しない場合はデフォルトのNoneのままで問題ありません。 例: cls=CustomDecoderとすれば、自分で定義したデコーダを使うことができます。
object_hook=None:
JSONオブジェクトをカスタムオブジェクトに変換したいときに使います。たとえば、辞書型としてではなく、自作のクラスのインスタンスに変換することができます。 デコード後に呼び出される関数を指定できます。 例:
def custom_hook(dct):
return CustomObject(dct)
data = json.loads(json_str, object_hook=custom_hook)
parse_float=float:
JSONの数値が浮動小数点数として認識されたときに、それを変換する関数を指定します。デフォルトではfloatが使われますが、Decimal型など他の型に変換したい場合に使えます。 例: parse_float=Decimal
parse_int=int:
JSONの整数値をデコードする際に、変換に使う関数を指定します。デフォルトではintが使われますが、例えばfloatに変換したい場合などに使えます。 例: parse_int=floatとすると、整数を浮動小数点数として扱います。
parse_constant=None:
JSONに含まれる無効な値(たとえばNaNやInfinity)に対して、特定の処理をさせたい場合に関数を指定します。デフォルトでは、これらの値がエラーを引き起こしますが、このパラメータを指定することでエラーを回避できます。 例:
def handle_invalid(val):
return 'InvalidValue'
data = json.loads(json_str, parse_constant=handle_invalid)
object_pairs_hook=None:
JSONオブジェクトのキーと値のペアを順序付きで保持したい場合に使います。このオプションを使うと、デコードされたオブジェクトをcollections.OrderedDictとして取得することができます。
from collections import OrderedDict
data = json.loads(json_str, object_pairs_hook=OrderedDict)
strict=True:
このオプションをFalseにすると、少しフォーマットが不正なJSONでも受け入れることができるようになります。通常はTrueにしておくのが推奨されますが、非標準のJSONを扱う必要がある場合に役立ちます。
{
'name': 'Yamada',
'age': 25,
'is_student': False,
'score': None
}
文字列を辞書型に変換するだけなのであまり使わないかも?? 自分がWeb系をあまりやってないからかもしれないけど・・・
json.dumps()関数
import json
# Pythonのデータ(辞書型)
data = {'name': 'Yamada', 'age': 25, 'is_student': False}
# PythonのデータをJSON形式の文字列に変換
json_str = json.dumps(data)
print(json_str)
# 出力例:{"name": "Yamada", "age": 25, "is_student": false}
print(type(json_str))
# 出力例:<class 'str'>
文字列で出力されるので、辞書型を文字列に変換するときに使うと便利!
import json
# Pythonのデータ
data = {
"name": "Yamada",
"age": 25,
"is_student": False,
"score": None,
"japanese": "山田"
}
# json.dumps()の全オプションを使ってみる
json_str = json.dumps(
data,
skipkeys=False, # 非対応なキーをスキップするか
ensure_ascii=True, # ASCII文字でエンコードするか
check_circular=True, # 循環参照をチェックするか
allow_nan=True, # NaNやInfinityを許容するか
indent=4, # インデントの深さ
separators=(',', ': '), # アイテムの区切り文字
default=str, # シリアライズ不可能なオブジェクトを変換するための関数
sort_keys=False # キーをソートするか
)
print(json_str)
各オプションの解説
skipkeys=False:
辞書のキーとして、Pythonの非サポートオブジェクト(たとえばsetやtupleなど)が含まれている場合、エラーが発生します。これをTrueに設定すると、そのようなキーをスキップし、エラーを回避します。 デフォルトはFalseで、エラーを発生させます。 例:
data = {("tuple_key",): "value"} # tupleはJSONで無効なキー
json_str = json.dumps(data, skipkeys=True)
ensure_ascii=True:
このオプションは、すべての非ASCII文字(日本語など)をエスケープしてASCII文字に変換するかどうかを指定します。デフォルトではTrueで、すべての文字は\uXXXXの形式に変換されます。日本語などの文字をそのまま出力したい場合はFalseに設定します。 これめっちゃ使う!
check_circular=True:
デフォルトでは、循環参照(同じオブジェクトが再帰的に参照される)を検出し、エラーを発生させます。これをFalseにすると、循環参照のチェックを行わなくなり、無限ループに陥る可能性があります。 普段はTrueで問題ありません。 例: 循環参照の例はあまり一般的ではありませんが、オプションを切り替えることで無限再帰を防ぎます。
allow_nan=True:
JSONではNaNやInfinityは無効な値ですが、デフォルトではPythonのfloat('nan')やfloat('inf')などをそのままNaNやInfinityとして許可します。Falseにすると、これらの値がエラーを引き起こします
indent=None:
インデントを指定することで、出力されるJSON文字列のフォーマットを整えます。Noneの場合は、すべてのデータが一行で出力されますが、数値を指定すると、その深さに応じたインデントが適用されます。これを使うと読みやすいJSONを出力できます。 例: indent=4 とすると、4スペースのインデントが追加されます。
separators=(',', ': '):
アイテムやキーと値のペアを区切る際の区切り文字を指定します。デフォルトは(',', ': ')で、アイテムはカンマ、キーと値の間はコロン+スペースで区切られます。例えば、スペースを取り除いてコンパクトにしたい場合は、(',', ':')と指定します
default=None:
通常、JSONに変換できないオブジェクト(例えばクラスのインスタンスなど)はエラーを引き起こします。このオプションで関数を指定すると、変換できないオブジェクトを処理する方法を指定できます。一般的にはstrを指定して、そのオブジェクトを文字列として変換します。
sort_keys=False:
デフォルトでは辞書のキーはそのままの順序で出力されますが、Trueに設定するとキーをアルファベット順にソートして出力します。
json.load() json.dump()
はファイルを読み込んだり、ファイルに書き込んだりするときに使います。
with open("data.json", "w") as f:
json.dump(data, f)
with open("data.json", "r") as f:
data = json.load(f)
print(data)
これらの関数は、ファイルオブジェクトを引数に取ります。ファイルを開いて、読み込んだり書き込んだりするときに使います。
よく文字化けを起こすので、ensure_ascii=Falseを指定して日本語をそのまま出力するといいです。
また、indent=4を指定すると、読みやすいフォーマットで出力されます。
with open("data.json", "w") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
{
"name": "Yamada",
"age": 25,
"is_student": false,
"score": null,
"japanese": "山田"
}
これで日本語もそのまま出力され、読みやすいフォーマットでJSONファイルが出力されます。
以下は文字化けパターン
with open("data2.json", "w") as f:
json.dump(data, f, indent=4)
{
"name": "Yamada",
"age": 25,
"is_student": false,
"score": null,
"japanese": "\u5c71\u7530"
}
jsonモジュールって、たぶんWeb系の開発で使うことが多いのかな? 自分がよく使うのは設定ファイルをjsonで読み込むときです。
ツールの初期設定をjsonで保存しておいて、それを読み込んで使うときに使います。
よく使うのが、パスを設定ファイルに書いておいて、それを読み込んで使うときです。
勤怠管理ファイルのパス 出力先のパス などなど・・・
{
"attendance_file": "C:/Users/username/attendance.csv",
"output_dir": "C:/Users/username/output"
}
上記をjsonモジュールを使って読み込む
import json
with open("config.json", "r") as f:
config = json.load(f)
df = pd.read_csv(config["attendance_file"], header=None)
# なんか処理する
df.to_csv(config["output_dir"])
この記事が気に入ったらサポートをしてみませんか?