2012年2月4日土曜日

Groovyで色々やってみた jsonについてのメモ その2

jsonデータの読み書きに関しての詳細
(前回、かなりいい加減なことを書いていたのでその修正)

Groovyバージョン:1.8.5

Java:1.7.0_02

関連する可能性のある情報


groovy.json.JsonBuilder

groovy.json.JsonSlurper

色々やってみたが現状において書き込みに関して確実な方法は


// ファイルのデータは既に存在するとします

File file = new File("...")

JsonBuilder builder = new JsonBuilder()

def root = builder.test{
     name{
            first 'John'
            last 'Do'
     }
}

// その1

// builder.toPrettyString()でも可
String text = builder.toString()
file.write(text)

// その2

file << builder

なお、jsonをエディタなどで編集する可能性が考えられる場合は

toPrettyString()で保存するほうが良いと思う。
無論、整形される分builder.toPrettyString()で出力されるデータは
builder.toString()より大きくなる。

その2についてはLeftShiftメソッドがFileクラスに実装されているので

JsonBuilderを引数として指定している。
(使われているのはおそらくFile.LeftShift(Object)だと思うのだが・・・)

JsonBuilderを使ってビルドしたデータを

そのままJsonSlurperを使ってパースするのは
parseData.parseText(builder.toString())でいけばいいとして、
JsonSlurperで構築したデータを保存する場合は(前回いい加減だった部分だが)

def parseData = new JsonSlurper().parse(...)

JsonBuilder builder = new JsonBuilder()

// JsonBuilder.call(Map)を利用している

builder parseData

とし、後はbuilderを先に書いた方法でファイルなどに書きこめばいい。


注意点としてはJsonSlurperによって

parseする際にデータのサイズが0(すなわち空のファイル)だと、
NullPointerExceptionが返されるようで、
JsonSlurperのソースコードを見た限りでは
JsonSlurper.parse(Reader r)内でNullPointerExceptionは返していないので、
メソッド内で使われているクラスのどこかで発生しているらしい。

原因は完全に突き止められなかったが

少なくともファイルのサイズをチェックしてからパースする必要はありそうだ。

警告:一応、コードに関しては動作確認はしておりますが、

プログラムの動作に関しての安全の保証はできかねます。
その為、このページのコードを利用する場合に
何が起きたとしても自己責任ということになります。
十分に注意してください。

閑話休題

GroovyConsoleがいい加減使いにくくなってきた。
もう少し機能を向上しても良いのではないだろうか。
今度はJsonSlurperでパースしたデータ(中身はMapなんだが)を
いじる方法についてやってみようかな。
にしても寒さが体に堪える。
風邪がぶり返しそうだ。