速水 康晴
 速水 康晴(はやみ やすはる)
 1stネクスパイア株式会社 新潟オフィス
◦ プログラマ:Java/Flex/ActionScript
 日本Grails/Groovyユーザーグループ(JGGUG)
◦ サポート・スタッフ
 E-mail:toby55kij@gmail.com
 Twitter:toby55kij
22013/09/20
 JSR353について
◦ 概要の説明
 Object Model API
◦ Groovyと組み合わせる例
2013/09/20 3
 Java API for JSON Processing (JSON-P)
◦ JavaでJSON処理を行う為のAPI
 http://json-processing-spec.java.net
 http://jcp.org/en/jsr/detail?id=353
◦ JavaEE 7に含まれる
 リファレンス実装:https://jsonp.java.net
◦ Expert Groupに日本人
 元Twitter社の「イケメン」さん
2013/09/20 4
APIは大きく分けて2つ
 Object Model API
◦ javax.json.JsonReader - 入力
◦ javax.json.JsonWriter - 出力
◦ javax.json.JsonBuilder – モデル構築
 Streaming API
◦ javax.json.stream.JsonParser – 入力
◦ javax.json.stream.JsonGenerator – 出力
javax.json.Jsonクラスが入り口
2013/09/20 5
JSON Object Model
 javax.json.JsonValue : JSONの値
◦ javax.json.JsonStructure : 構造を持つもの
 javax.json.JsonArray : JSON配列 - List<JsonValue>
 javax.json.JsonObject : JSONオブジェクト - Map<String,
JsonValue>
◦ javax.json.JsonNumber : JSON数値 - BigDecimalで保持
◦ javax.json.JsonString : JSON文字列
◦ JsonValue.TRUE : true
◦ JsonValue.FALSE : false
◦ JsonValue.NULL : null
2013/09/20 6
JsonValue#getValueType()で種類を判定
 列挙型JsonValue.ValueTypeの値
◦ OBJECT: JSONオブジェクト
◦ ARRAY : JSON配列
◦ NUMBER : JSON数値
◦ STRING : JSON文字列
◦ TRUE : true
◦ FALSE : false
◦ NULL : null
2013/09/20 7
 GroovyはJSONを標準で処理できる
◦ groovy.json.*
◦ Groovyで処理した方がほとんどの場合楽
 JsonSlurperがkey-valueの登録順を覚えてくれない位
 相互変換して使ってみる
◦ JSON Object Model → Map, List
 今回はこちらを説明
◦ JsonBuilder (Map, List, …) → JSON Object Model
2013/09/20 8
 JSR353のリファレンス実装
@Grapes(
@Grab(group='org.glassfish', module='javax.json',
version='1.0.2')
)
2013/09/20 9
 JSON Object Model → Map, List
static toJavaObject(JsonValue value) {
switch (value.getValueType()) {
case ValueType.OBJECT:
def map = new LinkedHashMap()
JsonObject object = (JsonObject) value
object?.each { String name, JsonValue v -> map[name] =
toJavaObject(v) }
return map
2013/09/20 10
case ValueType.ARRAY:
def list = new ArrayList()
JsonArray array = (JsonArray) value
array?.each { JsonValue v -> list << toJavaObject(v) }
return list
case ValueType.STRING:
JsonString st = (JsonString) value
return st.string
case ValueType.NUMBER:
JsonNumber num = (JsonNumber) value
return num.integral ? num.bigIntegerValueExact() :
num.bigDecimalValue()
2013/09/20 11
case ValueType.TRUE:
return Boolean.TRUE
case ValueType.FALSE:
return Boolean.FALSE
}
return null
}
2013/09/20 12
 今回のGroovyサンプル完全版
https://gist.github.com/toby55kij/6609800
2013/09/20 13

JSR353をGroovyで賢く使う