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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 01:05:29828ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。