Skip to content

Instantly share code, notes, and snippets.

@toby55kij
Created September 18, 2013 14:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save toby55kij/6609800 to your computer and use it in GitHub Desktop.
Save toby55kij/6609800 to your computer and use it in GitHub Desktop.
GroovyのJSON<->JSR353のObjectModel相互変換サンプル
@Grapes(
@Grab(group='org.glassfish', module='javax.json', version='1.0.2')
)
import groovy.json.JsonBuilder
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import javax.json.Json
import javax.json.JsonArray
import javax.json.JsonNumber
import javax.json.JsonObject
import javax.json.JsonReader
import javax.json.JsonString
import javax.json.JsonStructure
import javax.json.JsonValue
import javax.json.JsonValue.ValueType
/**
* JSR353のObjectModel -> Map, List変換サンプル
*/
class JsonCategory {
//JSR353のObjectModelを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
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()
case ValueType.TRUE:
return Boolean.TRUE
case ValueType.FALSE:
return Boolean.FALSE
}
return null
}
}
use(JsonCategory) {
//JSONファイルをJSR353のJsonReaderで読み込み
JsonReader reader = Json.createReader(new FileReader('./jsondata.json'))
JsonStructure jsonst = reader.read()
//読み込んだObjectModelを表示
println jsonst.toString()
//ObjectModelをMap, Listに変換
def val = jsonst.toJavaObject()
//JsonOutputでJSONとして表示
def s = JsonOutput.toJson(val)
println s
//出力内容が同一であることを確認
assert s == jsonst.toString()
//JSONファイルをJsonSlurperで読み込んだ場合
JsonSlurper slurper = new JsonSlurper()
def result = slurper.parse(new FileReader('./jsondata.json'))
//JsonOutputでJSONとして表示
def s2 = JsonOutput.toJson(result)
println s2
//出力内容としては異なる
assert s2 != jsonst.toString()
}
{
"firstName": "Duke",
"lastName": "Java",
"age": 18,
"streetAddress": "100 Internet Dr",
"city": "JavaTown",
"state": "JA",
"postalCode": "12345",
"phoneNumbers": [
{ "type": "mobile", "number": "111-111-1111" },
{ "type": "Home", "number": "222-222-2222" }
],
"memo": [ "memo1", "memo2", "memo3" ],
"value": 10.1,
"other": null
}
@Grapes(
@Grab(group='org.glassfish', module='javax.json', version='1.0.2')
)
import groovy.json.DateFormatThreadLocal
import groovy.json.JsonBuilder
import groovy.json.JsonDelegate
import java.text.SimpleDateFormat
import javax.json.Json
import javax.json.JsonArray
import javax.json.JsonArrayBuilder
import javax.json.JsonObject
import javax.json.JsonObjectBuilder
import javax.json.JsonStructure
import org.codehaus.groovy.runtime.DefaultGroovyMethods
/**
* Map, List (JsonBuilder) -> JSR353のObjectModel変換サンプル
*/
class JSR353Category {
private static final ThreadLocal<SimpleDateFormat> dateFormatter = new DateFormatThreadLocal()
//MapをJsonObjectへ変換
public static JsonObject toJsonObject(Map map) {
JsonObjectBuilder builder = Json.createObjectBuilder()
map?.each { String key, value ->
addJsonObject builder, key, value
}
return builder.build()
}
//JSONのキーと値をJsonObjectBuilderに追加
private static addJsonObject(JsonObjectBuilder builder, String key, String value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, Character value) {
builder?.add key, value.toString()
}
private static addJsonObject(JsonObjectBuilder builder, String key, Boolean value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, Integer value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, Long value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, Double value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, Float value) {
builder?.add key, value.doubleValue()
}
private static addJsonObject(JsonObjectBuilder builder, String key, BigInteger value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, BigDecimal value) {
builder?.add key, value
}
private static addJsonObject(JsonObjectBuilder builder, String key, Date value) {
builder?.add key, dateFormatter.get().format(value)
}
private static addJsonObject(JsonObjectBuilder builder, String key, Calendar value) {
builder?.add key, dateFormatter.get().format(value.time)
}
private static addJsonObject(JsonObjectBuilder builder, String key, UUID value) {
builder?.add key, value.toString()
}
private static addJsonObject(JsonObjectBuilder builder, String key, URL value) {
builder?.add key, dateFormatter.get().format(value)
}
private static addJsonObject(JsonObjectBuilder builder, String key, Expando value) {
builder?.add key, toJsonObject(value.properties)
}
private static addJsonObject(JsonObjectBuilder builder, String key, Closure value) {
builder?.add key, toJsonObject(JsonDelegate.cloneDelegateAndGetContent(value))
}
private static addJsonObject(JsonObjectBuilder builder, String key, value) {
if (value == null) {
builder?.addNull key
} else if (value instanceof Map) {
builder?.add key, toJsonObject(value)
} else if (value instanceof Collection ||
value.class.isArray() ||
value instanceof Iterator ||
value instanceof Enumeration) {
builder?.add key, toJsonArray(value.toList())
} else if (value instanceof Enum) {
builder?.add key, value.name()
} else {
Map properties = DefaultGroovyMethods.getProperties(value)
properties.remove('class')
properties.remove('declaringClass')
properties.remove('metaClass')
builder?.add key, toJsonObject(properties)
}
}
//ListをJsonArrayへ変換
public static JsonArray toJsonArray(List list) {
JsonArrayBuilder builder = Json.createArrayBuilder()
list?.each { it -> addJsonArray builder, it }
return builder.build()
}
//JSONの値をJsonArrayに追加
private static addJsonArray(JsonArrayBuilder builder, String value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, Character value) {
builder?.add value.toString()
}
private static addJsonArray(JsonArrayBuilder builder, Boolean value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, Integer value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, Long value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, Double value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, Float value) {
builder?.add value.doubleValue()
}
private static addJsonArray(JsonArrayBuilder builder, BigInteger value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, BigDecimal value) {
builder?.add value
}
private static addJsonArray(JsonArrayBuilder builder, Date value) {
builder?.add dateFormatter.get().format(value)
}
private static addJsonArray(JsonArrayBuilder builder, Calendar value) {
builder?.add dateFormatter.get().format(value.time)
}
private static addJsonArray(JsonArrayBuilder builder, UUID value) {
builder?.add value.toString()
}
private static addJsonArray(JsonArrayBuilder builder, URL value) {
builder?.add dateFormatter.get().format(value)
}
private static addJsonArray(JsonArrayBuilder builder, Expando value) {
builder?.add toJsonObject(value.properties)
}
private static addJsonArray(JsonArrayBuilder builder, Closure value) {
builder?.add toJsonObject(JsonDelegate.cloneDelegateAndGetContent(value))
}
private static addJsonArray(JsonArrayBuilder builder, value) {
if (value == null) {
builder?.addNull()
} else if (value instanceof Map) {
builder?.add toJsonObject(value)
} else if (value instanceof Collection ||
value.class.isArray() ||
value instanceof Iterator ||
value instanceof Enumeration) {
builder?.add toJsonArray(value.toList())
} else if (value instanceof Enum) {
builder?.add value.name()
} else {
Map properties = DefaultGroovyMethods.getProperties(value)
properties.remove('class')
properties.remove('declaringClass')
properties.remove('metaClass')
builder?.add toJsonObject(properties)
}
}
//JsonBuilderに設定された内容をJSR353のObjectModelへ変換
public static JsonStructure toJsonStructure(JsonBuilder builder) {
if (builder?.content instanceof Map) {
return toJsonObject(builder.content)
} else {
return toJsonArray(builder.content)
}
}
}
use(JSR353Category) {
//JsonBuilderでJSON作成
JsonBuilder builder = new JsonBuilder()
builder( firstName: "Duke",
lastName: "Java",
age: 18,
streetAddress: "100 Internet Dr",
city: "JavaTown",
state: "JA",
postalCode: "12345",
phoneNumbers: [
[
type: "mobile", number: "111-111-1111"
],
[
type: "Home", number: "222-222-2222"
]
],
memo: ["memo1", "memo2", "memo3"],
value: 10.1,
other: null)
//JsonBuilderで作成したJSON表示
println builder.toString()
//JSR353のObjectModelに変換
JsonStructure structure = builder.toJsonStructure()
//ObjectModelを表示
println structure.toString()
//内容が同一であることを確認
assert builder.toString() == structure.toString()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment