Jackson とジェネリック型リファレンス
Jackson の JSON ライブラリをジェネリック メソッドで使用しようとすると、開発者はネストされたカスタム オブジェクトが使用されないという問題が発生する可能性があります。実際のクラスではなく LinkedHashMap として返されます。この問題は、コンパイル中に型情報を削除する Java の型消去が原因で発生します。
提供されたコードでは、テスター メソッドは、JSON リクエストを汎用型 T の MyRequest オブジェクトに解析することを目的としています。ただし、指定されていません。 T の実際のクラスでは、ジャクソンはデフォルトでそれを T がオブジェクトを拡張し、JSON オブジェクトをマップにバインドするものとして扱います。
これを解決するには、JSON リクエストを逆シリアル化するときにテスター メソッドが実際のクラスにアクセスできる必要があります。これは、Class 引数として指定することで実現できます。次のコードは、これを行う方法を示しています。
<code class="java">public MyRequest<T> tester(Class<T> clazz) { TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>() {}; MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef); return requestWrapper.getRequest(); }</code>
さらに、逆シリアル化中に実際のクラスが使用されるようにするには、次のように TypeFactory を使用して JavaType を構築します。
<code class="java">JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clazz);</code>
Withこの変更により、Jackson は JSON リクエストを指定されたクラスのインスタンスを含む List に逆シリアル化し、getMyObject() メソッドが適切な型のオブジェクトを返すことができるようにします。
以上がJackson で型消去を使用してネストされた汎用オブジェクトを逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。