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

FILE_IN = 'sample_in.json'

f = open(FILE_IN, '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の中身
        }]
    }
}

すると、 load() の戻り値は dict 型のオブジェクトになります。

print type(data).__name__  # dict

load() で生成されるのは、 strdictlist 等の組み込み型のオブジェクトです。ですので、いったん読み込んだら、あとは通常の組み込み型のデータとして扱うことができます。

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 ファイルへの書き込み


FILE_OUT = 'sample_out.json'

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

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

対応関係


JSON の各型は次のとおりに Python の型にマッピングされます。 : の左が JSON の型、右が Python の型です。

  • object: dict
  • array: list
  • string: unicode
  • int: int, long
  • real: float
  • true: True
  • false: False
  • null: None

load() のときは JSON → Python の方向での変換なので左から右に、 dump() のときはその逆の右から左にイメージです。 TrueFalse なんかもうまく変換してくれるようです。

このあたりについて詳しくは公式ドキュメントの Encoders and Decoders の部分 を参照されるとよいかと思います。

今回取り上げた 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 件のコメント: