先日、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 });