PythonでJSONを扱うための方法を解説

PythonでJSONを扱うための方法を解説
公開
WEBシステム上の異なるプログラミング言語間のデータの受け渡し等に用いられる記法のうち、もっとも代表的なものにJSONがあります。 今回は、軽量かつ扱いやすいことが特徴のJSONをPythonで扱うための基本的な方法について実際のコードを交えて解説します。

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 にしてください。


この記事のキーワードに関する勉強会・イベントを探す

TECH PLAYでは、ITエンジニア向けの勉強会・イベント情報を提供しています。
興味のある方はぜひご参加ください。


フォロワー19,563人
TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす