2013/06/18

ライブラリ:json

Pythonの「json」というライブラリについてご紹介します。

import json

「json」は、その名のとおり、JSON形式のファイルをPythonで扱うためのライブラリです。

jsonライブラリの魅力は、何といってもシンプルな点です。「ElementTree」などに見られるような高度な機能は備えていませんが、本当にシンプルなのですぐに使いはじめることができます。

以下、使い方を見ていきます。

JSONで主に使う機能は次の2つです。
  1. json.load(f)
  2. json.dump(obj, f)

前者のload()はJSONファイルからデータを読み込むときに、dump()はJSONファイルへとデータを書き込むときに使用します。まずは読み込みについて、次に書き込みについて見ていきます。

JSONファイルの読み込み

import json

FILEIN = 'sample_in.json'

f = open(FILEIN, 'r')
data = json.load(f)
f.close()
open()で生成したファイルオブジェクトをload()関数に渡すことで、JSONファイルを読むことができます。

以下、sample_in.jsonには以下のような内容が入っているものとして見ていきます。
{
    "version": "1.0",
    "encoding": "UTF-8",
    "feed": {
        "title": {
            "type": "text",
            "$t": "Life with Python"
        },
        "entry": [{
        },{
            # エントリ1の中身
        },{
            # エントリ2の中身
        }]
    }
}

print type(data).__name__  # dict
load()で生成されるのは、通常の辞書型のオブジェクトです。ですので、いったん読み込んだら、あとはもう通常の辞書型のデータとして扱うことができます。
print data['version']  # 1.0
print data['encoding']  # UTF-8
for k in data:
    print k
# 以下のとおり表示
# feed
# version
# encoding
print data['feed']['title']['$t']
# Life with Pythonと表示
下の階層のデータを取得するには、このようにひとつずつ掘り下げていきます。このあたりもシンプルで、ElementTreeなどにあるような便利な機能はありません。

つづいて保存について。

JSONファイルへの書き込み

FILEOUT = 'sample_out.json'

f = open(FILEOUT, 'w')
json.dump(data, f)
f.close()
ファイルに書き込むときに使うのは、dump()です。引数は最小で2つあり、ひとつめに書き込みたいオブジェクトを、ふたつめに書き込みモードで開いたファイルオブジェクトを渡します。

ここでは辞書型のデータについて見てみましたが、そのほかの形式については次のように対応しています。

対応関係

JSONの各型は右のPythonの各型に対応しています。
  • object: dict
  • array: list
  • string: unicode
  • int: int, long
  • real: float
  • true: True
  • false: False
  • null: None
JSONでのobjectはPythonのdict型に、arrayはlist型に対応しています。load()のときはJSON→Python、つまり左から右に、dump()のときは逆で右から左に変換するイメージです。TrueやFalseなんかもうまく変換してくれるようです。

詳しくは公式ドキュメントのEncoders and Decodersのパートを参照されるとよいかと思います。

今回取り上げたload()、dump()はファイルを対象とした関数ですが、文字列を対象とした関数も用意されています。load()、dump()に対応するのが、それぞれの末尾にsをつけた
  1. loads(string)
  2. dumps(obj)
です。使い方もload()、dump()と全く同じ感じで使えるので、いったん文字列に起こしてから使いたい場合なんかはこちらを使うのがよいかと思います。

いずれの関数も細かいオプション設定ができるようになっているので、そのあたり詳しくは公式のドキュメントなどをご参照ください。

コマンドラインでの使い方

jsonには、コマンドラインで使うためのツールも用意されています。使用するのは、json.toolというモジュールです。
C:\>echo {"json": "obj", "json2": "obj2" } | python -m json.tool
{
    "json": "obj",
    "json2": "obj2"
}
C:\>echo [1, 2, 3] | python -m json.tool
[
    1,
    2,
    3
]
これはWindows XPで実行した場合です。引数の部分を「"」で囲うか囲わないかといったちがいはあるかと思うのですが、他のOSでもおおむね同じような形で使えるかと思います。

整形されていないjsonファイルを整形したい場合なんかには次のようにすると手軽に整形することができます。
C:\>python -m json.tool < 未整形のjson > 整形後のjson

ちょっとしたときに便利ですね。


・・・余談ですが、このBloggerでは、フィードURLにalt=jsonというパラメータをつけるとjson形式で返してくれます。たとえばこのブログならこんな感じです。練習台として便利なのでよろしければどうぞ。


参考
json - Python公式ドキュメント
JSON - python入門から応用までの学習サイト

0 件のコメント: