Java で Jackson を使用して JSON オブジェクト内のジェネリック型を逆シリアル化するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-31 01:05:29
オリジナル
825 人が閲覧しました

 How do I deserialize a generic type within a JSON object using Jackson in Java?

Jackson およびジェネリック型リファレンス

Java では、ジェネリックは他の型でパラメータ化できる型を表すために使用されます。これにより、コードの再利用と柔軟性の向上が可能になります。ただし、Jackson を使用して JSON を操作する場合、ジェネリック型は特定の課題を引き起こす可能性があります。

JSON オブジェクト内のジェネリック プロパティにアクセスするときに、1 つの一般的な問題が発生します。次の Java コードを考えてみましょう。

<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();
}

public class MyWrapper<T> {
    private MyRequest<T> request;
    public MyRequest<T> getRequest() { return request; }
    public void setRequest(MyRequest<T> request) { this.request = request; }
}

public class MyRequest<T> {
    private List<T> myobjects;
    public void setMyObjects(List<T> ets) { this.myobjects = ets; }
    @NotNull
    @JsonIgnore
    public T getMyObject() { return myobjects.get(0); }
}</code>
ログイン後にコピー

MyRequest オブジェクト内にある getMyObject() を呼び出すと、Jackson はネストされたカスタム オブジェクトを LinkedHashMap として返します。これは、Jackson がジェネリック宣言のみに基づいて T の実際の型を決定できないためです。

この問題を解決して T の型を指定するには、明示的なクラス引数が必要です。これは、次のように JavaType オブジェクトを構築することで実行できます。

<code class="java">TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>() {};
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, Foo.class);
MyWrapper<Foo> requestWrapper = mapper.readValue(jsonRequest, type);</code>
ログイン後にコピー

この例では、Foo クラスは T の実際の型を表します。必要な型で JavaType を構築することで、Jackson は適切にデシリアライズできます。 JSON オブジェクトを取得し、正しいタイプの T を返します。

以上がJava で Jackson を使用して JSON オブジェクト内のジェネリック型を逆シリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!