Jackson およびジェネリック型リファレンス: ネストされたジェネリック オブジェクトの処理
Jackson JSON ライブラリを使用すると、複雑なオブジェクト構造を強力に処理できます。ただし、カスタム オブジェクトでジェネリック型を使用する場合、一般的な課題が発生します。
問題ステートメント:
次のコードを検討してください:
<code class="java">public class MyWrapper<T> { private MyRequest<T> request; // ... getters and setters } public class MyRequest<T> { private List<T> myobjects; // ... getters and setters }</code>
汎用メソッドは、JSON オブジェクトを MyWrapper インスタンスに逆シリアル化しようとします:
<code class="java">public MyRequest<T> tester() { TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>(); MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef); return requestWrapper.getRequest(); }</code>
この問題は、ネストされた MyRequest オブジェクトで getMyObject() を呼び出すときに発生します。 Jackson は、必要な型 T のインスタンスの代わりに LinkedHashMap を返します。これは、Java の型消去によってコンパイル中に型情報が削除されるために発生します。
解決策:
正確な型 T が返される必要がある場合は、型に関する追加情報を Jackson に提供する必要があります。これは、Jackson マッパーの JavaType クラスを使用することで実現できます。
<code class="java">JavaType type = mapper.getTypeFactory(). constructCollectionType(List.class, Foo.class);</code>
tester() メソッドの行を次のように置き換えます。
<code class="java">TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>(); JavaType requestType = mapper.getTypeFactory(). constructCollectionType(MyRequest.class, type.getType()); MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, requestType);</code>
これにより、Jackson は、指定された型 Foo のリスト。 JSON オブジェクトを逆シリアル化すると、正しい型に変換されます。
Jackson にこの追加の型情報を提供することで、ネストされた汎用オブジェクトを正確に処理でき、取得時にオブジェクトが正しい型であることが保証されます。
以上がJackson を使用してネストされた汎用オブジェクトを逆シリアル化する方法: TypeReference と JavaType の使用ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。