Last active
August 29, 2015 14:11
-
-
Save tag1216/fe890f3a08efe60f2f1a to your computer and use it in GitHub Desktop.
This file contains hidden or 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
import java.util.Collection; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Objects; | |
import java.util.Optional; | |
import java.util.function.Function; | |
import java.util.stream.Collector; | |
import java.util.stream.Collectors; | |
import java.util.stream.Stream; | |
import java.util.stream.StreamSupport; | |
import com.google.gson.Gson; | |
import com.google.gson.JsonArray; | |
import com.google.gson.JsonElement; | |
import com.google.gson.JsonObject; | |
import com.google.gson.JsonParser; | |
public class Json { | |
/** | |
* JsonObjectを構築するためのJsonObjectBuilderのインスタンスを返す。 | |
* @return | |
*/ | |
public static JsonObjectBuilder objectBuilder() { | |
return new JsonObjectBuilder(); | |
} | |
/** | |
* JsonObjectを構築するためのJsonObjectBuilderのインスタンスを返す。 | |
* @param json 構築するJsonObjectの初期値 | |
* @return | |
*/ | |
public static JsonObjectBuilder objectBuilder(JsonObject json) { | |
return new JsonObjectBuilder(json); | |
} | |
/** | |
* JsonArrayを構築するためのJsonArrayBuilderのインスタンスを返す。 | |
* @return | |
*/ | |
public static JsonArrayBuilder arrayBuilder() { | |
return new JsonArrayBuilder(); | |
} | |
/** | |
* MapからJsonObjectを構築する。 | |
* @param map | |
* @return | |
*/ | |
public static <T> JsonObject toJsonObject(Map<String, T> map) { | |
return new Gson().toJsonTree(map).getAsJsonObject(); | |
} | |
/** | |
* 任意の型Tを要素に持つコレクションからJsonArrayを構築する。 | |
* @param list | |
* @param toJson 型TをJSONに変換する関数 | |
* @return | |
*/ | |
public static <T> JsonArray toJsonArray(Collection<T> list, ToJson<T> toJson) { | |
return Optional.ofNullable(list) | |
.map(x -> x.stream().map(toJson::toJson).collect(toJsonArray())) | |
.orElseGet(JsonArray::new); | |
} | |
/** | |
* JsonElementを要素にもつコレクションからJsonArrayを構築する。 | |
* @param list | |
* @return | |
*/ | |
public static <T extends JsonElement> JsonArray toJsonArray(Collection<T> list) { | |
return Optional.ofNullable(list) | |
.map(x -> x.stream().collect(toJsonArray())) | |
.orElseGet(JsonArray::new); | |
} | |
/** | |
* JSON文字列を解析してJsonElementを構築する。 | |
* @param text | |
* @return | |
*/ | |
public static JsonElement parse(String text) { | |
return new JsonParser().parse(text); | |
} | |
/** | |
* JsonElementのストリームからJsonArrayを構築するCollectorを返す。 | |
* @return | |
*/ | |
public static Collector<JsonElement, JsonArrayBuilder, JsonArray> toJsonArray() { | |
return Collector.of( | |
Json::arrayBuilder, | |
JsonArrayBuilder::add, | |
JsonArrayBuilder::add, | |
JsonArrayBuilder::build | |
); | |
} | |
/** | |
* TのストリームからJsonObjectを構築するCollector | |
* @param key プロパティ名を返す関数オブジェクト | |
* @param toJson TからJsonObjectを生成する関数オブジェクト | |
* @return | |
*/ | |
public static <T> Collector<T, JsonObjectBuilder, JsonObject> toJsonObject(Function<T, String> key, ToJson<T> toJson) { | |
return Collector.of( | |
Json::objectBuilder, | |
(s, e) -> s.add(key.apply(e), toJson.toJson(e)), | |
(s1, s2) -> { | |
s2.build().entrySet().forEach(entry -> s1.add(entry.getKey(), entry.getValue())); | |
return s1; | |
}, | |
JsonObjectBuilder::build | |
); | |
} | |
/** | |
* JsonArrayをListに変換する。 | |
* @param array | |
* @param mapper | |
* @return | |
*/ | |
public static <T> List<T> toList(JsonArray array, Function<JsonElement, T> mapper) { | |
return stream(array) | |
.map(mapper) | |
.collect(Collectors.toList()); | |
} | |
/** | |
* JsonArrayからJsonElementのストリームを構築する。 | |
* @param array | |
* @return | |
*/ | |
public static Stream<JsonElement> stream(JsonArray array) { | |
return StreamSupport.stream(array.spliterator(), false); | |
} | |
/** | |
* 指定のJSONが数値であるかチェックする。 | |
* @param json | |
* @return | |
*/ | |
public static boolean isNumber(JsonElement json) { | |
return Objects.nonNull(json) && json.isJsonPrimitive() && json.getAsJsonPrimitive().isNumber(); | |
} | |
/** | |
* 指定のJSONがBooleanであるかチェックする。 | |
* @param json | |
* @return | |
*/ | |
public static boolean isBoolean(JsonElement json) { | |
return Objects.nonNull(json) && json.isJsonPrimitive() && json.getAsJsonPrimitive().isBoolean(); | |
} | |
/** | |
* 指定のJSONがJsonが文字列であるかチェックする。 | |
* @param json | |
* @return | |
*/ | |
public static boolean isString(JsonElement json) { | |
return Objects.nonNull(json) && json.isJsonPrimitive() && json.getAsJsonPrimitive().isString(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment