この記事では、PythonによるJSON形式のデータの読書きについて調べて整理したことをまとめています。
PythonではJSONモジュールから以下の関数を呼び出すことでJSON形式のデータを扱うことが出来ます。
【読込み】
・json.load()
・json.loads()
【書込み・出力】
・json.dump()
・json.dumps()
それぞれ関数名に「s」が付くものと付かないものがあります。
結論として、json.load()とjson.loads()、json.dump()とjson.dumps()の違いは、扱う対象が「文字列」なのか、「ファイルやソケットオブジェクト」なのかという違いです。
【ファイルオブジェクトなどを扱う】
・json.load()
・json.dump()
【文字列として扱う】
関数名に「s」が付くものを利用します。
(※Stringの「s」を意味しているのかははっきりしませんでした。)
・json.loads()
・json.dumps()
それぞれ次の「sample.json」というファイルを例に具体的なコードで試していきます。
{
"sample01":{
"name":"first",
"id": 1
},
"sample02":{
"name":"second",
"id": 2
}
}
JSONファイルから読込む:json.load( )
import json
import pprint
# ---- JSONファイルから読込む -------
with open("sample.json", "r", encoding="utf-8") as f:
print(f"f type:{type(f)}")
#<class '_io.TextIOWrapper'>
json_load = json.load(f)
print(f"f type:{type(json_load)}")
#<class 'dict'>
pprint.pprint(json_load)
# {'sample01': {'id': 1, 'name': 'first'},
# 'sample02': {'id': 2, 'name': 'second'}}
取得したファイルオブジェクトをtype( )関数でみてみると、<class ‘_io.TextIOWrapper’>となっています。それを json.load() で読込み、変数「json_load」に格納しています。
json_loadをtype関数でみてみると、<class ‘dict’>と辞書型になっており、pprintで出力すると正しく読込めていることが分かります。
※キー名と値でデータを表現している点では、JSON形式も辞書型も同じです。
文字列を辞書型に変換する:json.loads( )
import json
import pprint
# ---- 文字列を辞書型に変換する -------
# 文字列として定義
data = '{"sample01": {"name": "first","id": 1},"sample02": {"name": "second","id": 2}}'
print(f"data type:{type(data)}")
#<class 'str'>
json_loads = json.loads(data)
print(f"json_loads type:{type(json_loads)}")
#<class 'dict'>
pprint.pprint(json_loads)
# {'sample01': {'id': 1, 'name': 'first'},
# 'sample02': {'id': 2, 'name': 'second'}}
文字列として定義した変数「data」をjson.loads( )で辞書型へ変換して読み込んでいます。
それぞれtype( )関数で出力してみると、type:<class ‘str’> → type:<class ‘dict’>に変わっているのが分かります。
辞書型をJSON形式でファイルに出力する:json.dump( )
import json
import pprint
# ---- 辞書型をJSON形式でファイルに保存する -------
# 辞書型で定義
data = {
"sample01": {
"name": "first",
"id": 1
},
"sample02": {
"name": "second",
"id": 2
}
}
with open("sample2.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
辞書型で定義した変数「data」をjson.dump( )でファイルへ出力しています。変数「data」を文字列として定義してしまうとTypeErrorとなります。
辞書型を文字列に変換する:json.dumps( )
import json
import pprint
# ---- 辞書型を文字列に変換する(json.dumps()) -------
# 辞書型で定義
data = {
"sample01": {
"name": "first",
"id": 1
},
"sample02": {
"name": "second",
"id": 2
}
}
print(f"data type:{type(data)}")
#<class 'dict'>
json_dumps = json.dumps(data, ensure_ascii=False)
print(f"json_dumps type:{type(json_dumps)}")
#<class 'str'>
print(json_dumps)
# {"sample01": {"name": "first", "id": 1}, "sample02": {"name": "second", "id": 2}}
使いどころはそんなに多くないかもしれませんが、json.dumps( )を使うことで辞書型→文字列へと変換して出力することが出来ます。
以上です。
参考になればうれしいです。
コメント