PythonでJSONを扱うための方法を解説
WEBシステム上の異なるプログラミング言語間のデータの受け渡し等に用いられる記法のうち、もっとも代表的なものにJSONがあります。
今回は、軽量かつ扱いやすいことが特徴のJSONをPythonで扱うための基本的な方法について実際のコードを交えて解説します。
JSONとは
JSONとはJavaScript Object Notationのことで、JavaScriptのオブジェクトの表記法を意味します。 WEBシステム上の異なるプログラミング言語間のデータの受け渡し等に用いられます。
JSONの特徴
JSONはJavaScriptの表記ではありますが、軽量かつ扱いやすいことからJavaScriptに限らず様々なプログラミング言語で使われており、WEB上に公開されている様々なAPI(WEB API:HTTP通信で呼び出すことのできるアプリケーション等のこと)が返却する結果の形式もJSON形式で渡されることが多いです。
また、その記法が人間にとって直感的に分かりやすいものであることも、特徴のひとつです。
JSONは『キーと値』という形式のツリー構造の文字列であり、適切に整形された状態のJSONは、どの項目がどういった構造になっているのかが一目でわかるようになっています。
プログラムにとっても構造を分析しやすい記法であり、容易にJSON内のデータをプログラムで扱える形式に変換できるということも、JSONの大きな利点のひとつです。
このようにJSONには有用と認められる多くの特徴があり、そのため多くのプログラミング言語でJSONを扱うためのライブラリ等が提供されています。
PythonでJSONを扱うには?
PythonでJSONを扱うためには、Python標準ライブラリのjsonモジュールを使用します。
jsonモジュールにはPythonでJSONを扱うための様々なメソッドが用意されており、これらを利用するためにjsonモジュールをインポートする必要があります。
jsonモジュールを使ってPythonでJSONを扱う
PythonでJSONを扱うために、まず以下のようにjsonモジュールをインポートしましょう。
import json
これでjsonモジュールがインポートされ、JSONを扱うための様々なメソッドを使用できるようになります。
JSONを読み込む
JSONを読み込むには大きく分けてふたつのパターンがあります。
ひとつは、ファイルから読み込むパターン。もうひとつは、ファイルではなく文字列から読み込むパターン。
どちらのパターンの読み込みであるかによって、使用するメソッドが変わります。
なお、読み込んだJSONは『キーと値』という形式でデータを扱うことが可能な辞書型に変換されます。
まず、ファイルから読み込むパターンを解説します。
ファイルから読み込む場合には、json.load()
メソッドを使用します。
# まずjsonファイルを用意し、json01.txtとして保存する。
# {"url": "http://xxx.com", "archived_snapshots": {"closest": {"status": "200", "available": true, "url": "http://web.archive.org/web/20180807200529/http://xxx.com:80/", "timestamp": "20180807200529"}}}
# 以下実行プログラム
# 用意したjson01.txtを読み込み、出力する
import json
with open('json01.txt') as file:
print(json.load(file))
# 以下実行結果
# {'url': 'http://xxx.com', 'archived_snapshots': {'closest': {'status': '200', 'available': True, 'url': 'http://web.archive.org/web/20180807200529/http://xxx.ocm:80/', 'timestamp': '20180807200529'}}}
json.load(対象ファイル)
は処理の結果としてファイルのJSONを辞書型に変換して返却します。このとき、JSONのキーは辞書型のキーに、JSONの値は辞書型の値として(つまり『キーと値』という構造をそのままにして)変換されます。
ですのでJSONから変換された辞書型の返却値は、通常通り辞書型の値を扱うのと同様に利用できます。
これはつまり { “type”: “human” }
というJSONを辞書型に変換した場合には、JSONのキー名そのままで『オブジェクト[type]』で値『”human”』を取得できるということです。
次に、文字列から読み込むパターンを解説します。
プログラム上に文字列として取得済みのjsonを読み込む場合には、json.loads()
メソッドを使用します。前述のload()
メソッドと名前がよく似ていますが、こちらはloads()
ですので間違えないよう気を付けましょう。
# 以下実行プログラム
import json
jsonStr = '{"url": "http://xxx.com", "archived_snapshots": {"closest": {"status": "200", "available": true, "url": "http://web.archive.org/web/20180807200529/http://xxx.com:80/", "timestamp": "20180807200529"}}}'
print(json.loads(jsonStr))
# 以下実行結果
# {'url': 'http://xxx.com', 'archived_snapshots': {'closest': {'status': '200', 'available': True, 'url': 'http://web.archive.org/web/20180807200529/http://xxx.com:80/', 'timestamp': '20180807200529'}}}
json.loads()
メソッドも前述の json.load()
と同様に、読み込んだjsonを辞書型に変換しています。
そのため取得した値は辞書型として扱うことができます。
JSONをファイルに出力する
辞書型の値をJSONに変換してファイルに出力するには、json.dump()
メソッドを利用します。 json.dump()
メソッドを使用したサンプルコードは次の通りです。
# 以下実行プログラム
import json
dictionary = {'url': 'http://xxx.com', 'archived_snapshots': {'closest': {'status': '200', 'available': True, 'url': 'http://web.archive.org/web/20180807200529/http://xxx.com:80/', 'timestamp': '20180807200529'}}}
# 辞書型 → JSON形式の文字列でファイル書き込み
with open('blank01.txt', 'w') as file: # 第二引数:writableオプションを指定
json.dump(dictionary, file)
with open('blank01.txt') as file:
print(file.read())
# 以下実行結果
# {"url": "http://xxx.com", "archived_snapshots": {"closest": {"status": "200", "available": true, "url": "http://web.archive.org/web/20180807200529/http://xxx.com:80/", "timestamp": "20180807200529"}}}
json.dump()
メソッドの引数はそれぞれ以下を指定します。
- 第一引数:変換する対象の辞書型の値を指定
- 第二引数:変換したJSON文字列を出力するファイルを指定
また、ファイル書き込み時にはwith構文中のopen()
メソッドにwritableオプション ('w')
をつけてください。 writableオプションが指定されていない場合、ファイルへの書き込みは無効化されます。
JSONを整形して出力する
同じく json.dump()
メソッドを利用して、JSONを整形した上でファイルに書き込むこともできます。
# 以下実行プログラム
import json
dictionary = {'url': 'http://xxx.com', 'archived_snapshots': {'closest': {'status': '200', 'available': True, 'url': 'http://web.archive.org/web/20180807200529/http://xxx.com:80/', 'timestamp': '20180807200529'}}}
# 辞書型 → JSON形式の文字列を【整形した上で】ファイル書き込み
with open('blank02.txt', 'w') as file: # 第二引数:writableオプションを指定
json.dump(dictionary, file, indent=2) # 第三引数:インデントのスペース数を指定
with open('blank02.txt') as file:
print(file.read())
# 以下実行結果
# {
# "url": "http://xxx.com",
# "archived_snapshots": {
# "closest": {
# "status": "200",
# "available": true,
# "url": "http://web.archive.org/web/20180807200529/http://xxx.com:80/",
# "timestamp": "20180807200529"
# }
# }
# }
このように整形して出力するためには、dump()
メソッドの第三引数にインデントの指定をする必要があります。サンプルコード上では、dump()
の第三引数に indent=2
を指定しています。
こう書くことで、インデントをスペース2つ分で行う形式でJSONを整形し出力できます。 インデントのスペースの数を4つにしたい場合は、第三引数に指定するインデントを indent=4
にしてください。
JSONデータに追加する
JSONデータに新しいキーと値のペアを追加するには、キーを指定して値を代入します。以下の例では、dictionary
に'email'
というキーと対応する値を追加しています。
# 以下実行プログラム
import json
dictionary = {'url': 'http://xxx.com', 'archived_snapshots': {'closest': {'status': '200', 'available': True, 'url': 'http://web.archive.org/web/20180807200529/http://xxx.com:80/', 'timestamp': '20180807200529'}}}
# データemailを追加
dictionary['email'] = 'staff_01@sample.com'
# 辞書型 → JSON形式の文字列を【整形した上で】ファイル書き込み
with open('blank02.txt', 'w') as file: # 第二引数:writableオプションを指定
json.dump(dictionary, file, indent=2) # 第三引数:インデントのスペース数を指定
with open('blank02.txt') as file:
print(file.read())
# 以下実行結果
# {
"url": "http://xxx.com",
"archived_snapshots": {
"closest": {
"status": "200",
"available": true,
"url": "http://web.archive.org/web/20180807200529/http://xxx.com:80/",
"timestamp": "20180807200529"
}
},
"email": "staff_01@sample.com"
}
JSONデータを更新する
既存のキーの値を更新するには、キーを指定して新しい値を代入します。
先程のデータ追加のコードの部分に以下のコードを追加すると、実行結果で キー email
の値は staff_02@sample.com
となります。
dictionary['email'] = 'staff_02@sample.com'
JSONデータを削除する
既存のキーの値を削除するには、del
メソッドを使います。
先程のデータ追加のコードの部分に以下のコードを追加すると、実行結果で キー url
とその値は出力されません。
del dictionary['url']
まとめ
ここまで、PythonでのJSONの扱い方について説明してきました。
ここでは主に用意したファイルを読み込む例を挙げましたが、Web APIからJSONデータを取得し、Pythonで処理することも可能です。
これを応用してデータの自動取得や外部サービスとの連携にも役立てることができます。