2012年1月17日火曜日

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

Groovyバージョン:1.8.5
Java:1.7.0_02

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

groovy.json.JsonBuilder
groovy.json.JsonSlurper

Jsonのデータの扱い方についてのメモを以下に記述する。

import groovy.json.JsonBuilder
import groovy.json.JsonSlurper

//JsonBuilder:

def builder = new JsonBuilder()
def root = builder.jsonTest{
     sample1{
// 「名前 値」のデータ。json内では 名前:”値”で記述される。
          name 'Jane Do'
          type 'female'
          number '00001'
// マップとして格納されているデータ。
          data(
                 ups: '213',
                 dto: 'nomal'
                 attr: 'auto detect'
           )
// Boolean型のデータ。json内では名前も値も文字列として記述されている。
           flag false
// 配列として格納されているデータ
           ports 'f204','fa412','g514'
     }
}

// class java.util.LinkedHashMap
println root.getClass().toString()

// class java.util.LinkedHashMap
println root.jsonTest.getClass().toString()

// スクリプト名$クロージャ名
println root.jsonTest.sample1.getClass().toString()

//JsonSlurper:

def slurper = new JsonSlurper()
def root2 = slurper.parseText(builder.toString())

// class java.util.HashMap
println root2.getClass().toString()

// root2内のデータを階層構造で表示
println root2.toString()

// Jane Do
println root2.jsonTest.sample1.name

メソッドについて
JsonBuilder:
 def call()

メソッドの引数は現在のところ4種類
Map,List,Object...(オブジェクトの配列だと考えて良いだろう),Closureのデータを元に
json内のルート直下にデータを作成する。

 def invokeMethod(String name, Object args)

json内へのデータの作成に利用されます。
一例としては
def json = new JsonBuilder()
json.person(name: "John Do", age: 33) { type "male" }
assert json.toString() == '{"person":{"name":"John Do","age":33,"type":"male"}}'
という感じになります。

 String toPrettyString()

jsonのデータを整形して出力する。

 Writer writeTo(Writer out)

指定したWriterへのデータの書き込みを行います。
残念ながら確認が現在とれていません。
JsonSlurper:

 Object parse(Reader reader)

指定されたReaderからJsonデータを構築します。

 Object parseText(String text)

指定されたテキストからJsonデータを構築します。

備考:
BuilderとSlurperが構築するデータには明らかな違いがあるので同じように利用しようとすると、
例外が出てしまうので注意してください。
個人的にはBuilderで構築したデータを内部で利用する場合、そのまま制御するのではなく、
Slurperに渡してパースして利用したほうが割と利用しやすいと思います。
そしてSlurperで構築したデータを保存する場合には

//未検証です。注意してください。
def builder = new JsonBuilder()
builder.call(root2)
builder.writeTo(file.newWriter())

とやればいけるのではないかと・・・(builder.call(...) あたりがちょっと怪しいが)

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

閑話休題

体の調子は良くなってきたが咳がまだ続くのは困ったものだ。
それとSeleniumのバージョンの上がり具合がえらく早い(2.16.1って・・・)