Skip to content

Instantly share code, notes, and snippets.

@tag1216
Last active August 29, 2015 14:11
Show Gist options
  • Save tag1216/fe890f3a08efe60f2f1a to your computer and use it in GitHub Desktop.
Save tag1216/fe890f3a08efe60f2f1a to your computer and use it in GitHub Desktop.
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