saba1024のブログ

どうでも良い思いついた事とかプログラミング関係のメモとか書いていきます。

GroovyでJSONをパースする(JsonSlurper)

概要

JsonBuilderを使えば、Groovy上で簡単にJSONを生成できますが、同様に既存のJSON(テキスト)を解析してGroovyで扱う事も非常に簡単です。
そのためには、JsonSlurperというクラスを利用します。

使い方

本当に簡単なので以下のソースを見て頂ければ一目瞭然です。
単純にJsonSlurperインスタンスを生成して、そのparseTextメソッドにJSON(テキスト)を渡してあげるだけです。

import groovy.json.*
String jsonText = '''
{
    "name": "koji",
    "age": 32,
    "hobbies": [
        {
            "id": 1,
            "name": "hobby1"
        },
        {
            "id": 2,
            "name": "hobby2"
        }
    ],
    "address": {
        "country": "japan",
        "city": "tokyo"
    }
}
'''

def json = new JsonSlurper().parseText(jsonText)
assert json.name == 'koji'
assert json.age == 32
assert json.hobbies.size() == 2

// 配列(リスト)に入っている各オブジェクトにも普通にアクセスできる。
assert json.hobbies[0].id == 1
assert json.hobbies[0].name == 'hobby1'
assert json.hobbies[1].id == 2
assert json.hobbies[1].name == 'hobby2'

//オブジェクト内のオブジェクトにも当然普通にアクセスできる。
assert json.address.country == 'japan'
assert json.address.city == 'tokyo'

// 実は各オブジェクトは、Mapでは無くてJSON専用のLazyMapなので注意。
assert json.hobbies[0] instanceof groovy.json.internal.LazyMap
assert json.hobbies[1] instanceof groovy.json.internal.LazyMap
assert json.address instanceof groovy.json.internal.LazyMap

Webアプリを開発する際にWebフレームワークを使うのであれば、通常はリクエストから自動でJSONオブジェクトを生成するライブラリや機能が付属していると思いますので中々JsonSlurper自体を直接触る事はないかも知れませんが、どこかから提供されているデータがJSON形式の場合で、それを使ってサクッと何か計算なりをしたい場合には非常に役立つ機能だと思います。

参考:
JsonSlurper