JSONのキーから、JsonElement

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