先日の Jackson 使用する JSON解析の方法では、
oboe2uran.hatenablog.com
JSON構造の中階層のキーを任意クラス型に変換させる場合、
ObjectMapper から com.fasterxml.jackson.databind.ObjectReader を取得して、
readValue(JsonNode) メソッドを実行すれば、目的の型インスタンスで
解析結果を得ることができるのだが、この readValue メソッドが
throws IOException 宣言のメソッドなので、どうしても例外捕捉記述が必要になる。
JSON キー group の配列の中に、Foo クラスに解析したいものが並んでいる場合のデシリアライザ登録
JsonNodeParse jparse = new JsonNodeParse(); jparse = jparse.addDeserilaize(Pattern.compile("group\\[\\d+\\]"), n->{ try{ return new ObjectMapper().readerFor(Foo.class).readValue(n); }catch (IOException e){ return null; } });
これは、ちょっと長い。
そこでこれを簡潔するにするのが、Throwable な Function を用意して使用する方法である。
yipuran-core ライブラリに入れておいた
throwable な Function
https://github.com/yipuran/yipuran-core/blob/master/src/main/java/org/yipuran/function/ThrowableFunction.java
を使用することだ。
jparse = jparse.addDeserilaize(Pattern.compile("group\\[\\d+\\]"), ThrowableFunction.of(new ObjectMapper().readerFor(Foo.class)::readValue));
にする。
このラムダを使用する際、Jackson の ObjectReader は、くれぐれも、readerForUpdating(T) を使わないように
気をつけないと思わぬ落とし穴が待っているので注意が必要。
ThrowableFunction の代わりにJsonNodeParse に以下の staticメソッドを追加して、
記述しても良いかもしれない。。。
JsonNodeParse に追加するメソッド
public static Function<JsonNode, Object> toFunction(Class<?> cls){ return t->{ try{ return new ObjectMapper().readerFor(cls).readValue(t); }catch(Throwable ex){ throw new RuntimeException(ex); } }; }
以下のように簡潔になる。
jparse = jparse.addDeserilaize(Pattern.compile("group\\[\\d+\\]"), JsonNodeParse.toFunction(Foo.class));