先日、JSONのキーを、GSONを使用してセパレータ "." ドットで繋げて値を取得するものを書いてみた。
oboe2uran.hatenablog.com
でも、配列など JsonArray として取得して使用したい場合もあり要件が外れる時もある。
それに長ったらしいコードで気に要らない。
セパレータ "." ドットでキーを繋げて指定し、Optional<JsonElement > で取得したい。
キーは、半角英数字と "_"アンダースコア のみという約束で、以下のメソッドを作成
public static Optional<JsonElement> elementParse(Reader reader, String key){
return elementParse(new JsonParser().parse(reader), key);
}
public static Optional<JsonElement> elementParse(JsonElement je, String key){
if (!je.isJsonObject()) return Optional.empty();
if (key.contains(".")){
String[] sp = key.split("\\.");
if (sp.length > 1){
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
je.getAsJsonObject().entrySet().iterator(), Spliterator.ORDERED ), false)
.filter(e->e.getKey().equals(sp[0])).findAny()
.flatMap(e->elementParse(e.getValue() , key.replaceFirst("^[\\w_]+\\.", "")));
}else{
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
je.getAsJsonObject().entrySet().iterator(), Spliterator.ORDERED ), false)
.filter(e->e.getKey().equals(sp[0])).findAny().map(e->e.getValue());
}
}
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
je.getAsJsonObject().entrySet().iterator(), Spliterator.ORDERED ), false)
.filter(e->e.getKey().equals(key)).findAny().map(e->e.getValue());
}使い方
try(InputStream in = new FileInputStream("test.json");
Reader reader = new InputStreamReader(in, "UTF-8")){
Optional<JsonElement> e = elementParse(reader, "a.b.c");
e.ifPresent(je->{
// TODO
});とするか
try(InputStream in = new FileInputStream("test.json");
Reader reader = new InputStreamReader(in, "UTF-8")){
JsonElement elment = new JsonParser().parse(reader);
Optional<JsonElement> e = elementParse(elment, "a.b.c");
e.ifPresent(je->{
// TODO
});