【Python】JSONの読書き|dump、dumpsの違い

プログラマのメモ帳

この記事では、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( )を使うことで辞書型→文字列へと変換して出力することが出来ます。

以上です。
参考になればうれしいです。

コメント

タイトルとURLをコピーしました