JSONはWebアプリケーションでデータのやりとりを行う際に使われるデータ形式です。JSONは人間にもコンピュータにも扱えるように作られた記法ですが、データの量が多くなるとそのままでは読みづらく、ある程度パース(解析)をする必要があります。そこで今回は、PythonでJSONをパースする方法について説明します。
なお、今回の記事では例として「test.json」というjsonファイルを使います。

test.json
{
    "book1":{
	"title":"Python Beginners",
 	"year": 2005 ,
	"page": 399
},
    "book2":{
    	"title": "Python Developers",
    	"year": 2006 ,
	"page": 650
},
"book3":{
	"title":"Python cookbook",
 	"year": 2002 ,
"page": 344
},
"book4":{
    	"title": "Python Dictionary",
    	"year": 2012 ,
	"page": 1024
}
}

JSONデータの読み込み

PythonでJSONデータをパースするには、まずJSONデータを辞書型として読み込む必要があります。JSONデータを読み込む方法は大きく分けて2種類あります。

JSONファイルから読み込む

JSONファイルとして保存されているデータを読み込む方法です。データの読み込みにはjsonモジュールのload関数を使います。

import json  #必ず必要
変数1 = open(‘読み込むJSONファイルのパス’ , ‘r’)
変数2 = json.load(変数1)

まずはJSONファイルは通常のファイルオープンと同様にopen関数で開きます。そして、開いたJSONファイルのファイル変数をjson.loadの引数に渡すことで、JSONファイルを読み込むことができます。load関数で読み込んだJSONファイルは辞書型で保存されます。

import json
f = open('test.json', 'r')
json_dict = json.load(f)
print('json_dict:{}'.format(type(json_dict)))

実行結果

json_dict:

JSON文字列を辞書型に変換する

JSONデータを読み込むには、JSON形式の文字列を辞書型に変換する方法もあります。JSON形式の文字列の変換にはjsonモジュールのloads
関数を使います。load関数と似ているので間違えないようにしましょう。

import json
変数1 = json.loads(変数2)  #変数2はJSON形式の文字列

loads関数は引数にJSON形式の文字列を渡すと、辞書型に変換して返します。

import json
json_str = '''
{
    "test":"json",
    "test2":"json2"
}
'''
json_dict = json.loads(json_str)
print('json_dict:{}'.format(type(json_dict)))

実行結果

json_dict:

JSONファイルから順序を保ったまま読み込む

load関数を使うことでJSONファイルからデータを読み込むことができますが、そのまま読み込む場合は問題が一つあります。それは、Pythonの辞書型は順番を保たないので、普通にJSONファイルを読み込むと毎回順番がバラバラになってしまいます。それを防ぐためには、loadの「object_pairs_hook」オプションを利用します。

import json
json_str = '''
{
    "test":"json",
    "test2":"json2"
}
'''
json_dict = json.loads(json_str)
print('json_dict:{}'.format(type(json_dict)))

実行結果

json_dict:

Pythonには順番を保ったまま保存する辞書型である「OrderedDict」という型が存在します。JSONをload関数で読み込む際に「object_pairs_hook」オプションで「collections.OrderedDict」を指定することで、JSONデータをOrderedDict型として読み込むので、順序を保ったまま読み込むことができます。

必要なデータを取り出す

JSONの読み込みが完了したら、いよいよJSONデータを解析していきます。JSONデータを解析する際には、JSONデータから必要なデータを取り出す必要がありますが、実はPythonではJSONは辞書型で扱われるので、辞書型と同じ扱いをすることができます。

import json
f = open('test.json', 'r')
json_dict = json.load(f)
print('book1の情報:{}'.format(json_dict['book1']))
print('book3のページ数:{}'.format(json_dict['book3']['page']))

実行結果

book1の情報:{‘title’: ‘Python Beginners’, ‘year’: 2005, ‘page’: 399}
book3のページ数:344

この例では、通常の辞書型のようにキーを指定して値を取り出しています。また、辞書型のメソッドを使ったり、for文でイテレートすることもできるので、好きなようにデータを取り出す事が出来ます。

import json
f = open('test.json', 'r')
json_dict = json.load(f)
for x in json_dict:
    book_page = json_dict[x]['page']
    if(book_page >= 500):
        print('{0}:{1}'.format(x, json_dict[x]))

実行結果

book4:{‘page’: 1024, ‘year’: 2012, ‘title’: ‘Python Dictionary’}
book2:{‘page’: 650, ‘year’: 2006, ‘title’: ‘Python Developers’}

この例では、JSONデータの中から[page]が500以上のものだけを取り出しています。Pythonの場合は、便利なメソッドが多数用意されているので、JSONデータの解析も簡単に行えます。

コマンドラインで解析する

ここまではPythonのスクリプトを記述してJSONを読み込んだりパースしてきました。しかし、ちょっとした量のJSONを表示したり解析するためだけに毎回スクリプトを記述するのは面倒くさいです。
そんな時のために、Pythonではコマンドライン上で簡易的なJSONオブジェクトの表示や解析を行うことができます。コマンドライン、もしくはターミナルを起動し、以下のように入力することでコマンドライン上にJSONファイルの中身を表示することができます。

python -m json.tool test.json

実行結果

{
“book1”: {
“title”: “Python Beginners”,
“year”: 2005,
“page”: 399
},
“book2”: {
“title”: “Python Developers”,
“year”: 2006,
“page”: 650
},
“book3”: {
“title”: “Python cookbook”,
“year”: 2002,
“page”: 344
},
“book4”: {
“title”: “Python Dictionary”,
“year”: 2012,
“page”: 1024
}
}