Jackson で型消去を使用してネストされた汎用オブジェクトを逆シリアル化する方法

DDD
リリース: 2024-10-28 16:15:43
オリジナル
836 人が閲覧しました

How to Deserialize Nested Generic Objects in Jackson with Type Erasure?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート