JWT JSON読込み

JSON Web Tokens - jwt.ioJSON読込みについて、、、
デコードしたJWT の getClaims() が返す Mapが、Claimインスタンスのマップであるが、 この Claimインスタンスは、隠されたクラス com.auth0.jwt.impl.JsonNodeClaim である。 この JsonNodeClaim が値を格納するフィールドが、
private final JsonNode data であり
これを直接参照することは許されていない。
値が、double か、整数の long / int のJSONなのかを見極めるためには、 Jackson のJSONノード解析が必要だ。

先日のJsonNodeParse
Jackson JSON読込み、key-value 解析を柔軟にする - Oboe吹きプログラマの黙示録
に以下を追加する。

public Stream<Entry<String, Object>> jsonStream(String path, JsonNode node){
   Stream.Builder<Entry<String, Object>> builder = Stream.builder();
   parseJson(node, path, builder);
   return  builder.build();
}
public void readJson(JsonNode node, String path, BiConsumer<String, Object> con){
   parseJson(node, path, con);
}

さらに、、隠されたクラス com.auth0.jwt.impl.JsonNodeClaim の参照の為に、以下メソッドを用意する。
かなり強引なメソッドだ。

public static JsonNode claimToJsonNode(Claim cliam) {
  JsonNode node = null;
  try{
     Field fd = cliam.getClass().getDeclaredField("data");
     fd.setAccessible(true);
     Object o = fd.get(cliam);
     node = (JsonNode)o;
  }catch(NoSuchFieldException e){
     throw new RuntimeException(e);
  }catch(SecurityException e){
     throw new RuntimeException(e);
  }catch(IllegalArgumentException e){
     throw new RuntimeException(e);
  }catch(IllegalAccessException e){
     throw new RuntimeException(e);
  }
  return node;
}

上記メソッドとメソッド追加したJsonNodeParse を利用して、
JWTのトークンは、以下のように、Streamで値参照の処理を書くことができる。

DecodedJWT jwt = JWT.decode(token);
Map<String, Claim> map = jwt.getClaims();
map.entrySet().stream()
.flatMap(e->jp.jsonStream("."+e.getKey(), claimToJsonNode(e.getValue())))
.forEach(e->{
    // TODO  e.getKey() = JSONパス、  e.getValue() = JSON の値Object
});

pom.xml は、、、

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.15.0</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.12.3</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.12.3</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.12.3</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.12.3</version>
</dependency>