Created
September 18, 2013 14:18
-
-
Save toby55kij/6609800 to your computer and use it in GitHub Desktop.
GroovyのJSON<->JSR353のObjectModel相互変換サンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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