2017-05-28 16 views
1

私はfasterxml.jacksonを使用しています。私はreadValue()について混乱しています。ここに私の質問です。JSONによる配列のデシリアライズ方法

私はjacksonが通常のJavaBeanとCollectionを2つの異なる方法でデシリアライズすることを知っています。 JavaBeanの場合、MyBean.classまたはnew TypeReference<MyBean>readValue()に渡すことができます。コレクションの場合は、new TypeReference<List<MyBean>>を渡す必要があります。これは、TypeReferenceがCollectionによって消去されたタイプを保存するためです。私は正しい? :)

今私は混乱しています。 MyBeanにリストが含まれている場合、私はまだMyBean.classを渡すことができ、それは動作します。ジャクソンはどうしたの?

public class MyBean { 
    String str; 
    List<String> strList; 
} 
+0

strListフィールドの汎用タイプは、リフレクションを使用して使用できます。しかし、Javaでは 'List .class'を引数として渡すことはできません。 'List.class'だけです。 –

+0

多分このリンクはあなたを助けますhttps://stackoverflow.com/a/6349488/6296931 –

+0

私の質問は:私はJSONがタイプ消去のためにリストを逆直列化できないと思います。そのため、TypeReferenceを渡す必要があります。しかし、Java Beanにリストが含まれている場合、JSONはどのようにランタイムでそのジェネリックを知ることができますか? – zchen

答えて

0

あなたはreadValue()に2番目の引数としてMyBean.classを渡しているとジャクソンはリフレクションを通じてこのことから型を取得することができます。私はジャクソンが次のようなことをすると思います。

MyBean.class.getDeclaredField("strList").getGenericType(); 

java.util.List<java.lang.String>というタイプになります。

class MyBeanにはList<String>が含まれています。あなたは、インスタンスのために持っていた場合:

class MyGenBean<T> { 
    List<T> list; 
} 

その後、

MyGenBean.class.getDeclaredField("list").getGenericType(); 

java.util.List<T>を返します、あなたはTypeReferenceが必要になります。

関連する問題