1

次のような JSON 構造があります。

[
    {
        "id": 0,
        "name": "Foo"
    },
    {
        "id": 1,
        "name": "Bar"
    }
]

およびデータ バインディング用の対応する Java オブジェクト:

public class Thing {
    public int id;
    public String name;
}

JSON リストを のリストに逆シリアル化する方法を知っていますThing

ここでトリッキーな部分が来ます: 私がやりたいことは、このクラスに変更を加えることだけで、次のスニペットのように見えるクラスに JSON をデシリアライズすることです:

public class Things {
    private List<Thing> things;

    public void setThings(List<Thing> things) {
        this.things = things;
    }

    public List<Thing> getThings() {
        return this.things;
    }
}

これは、次のように ObjectMapper を使用して、JSON デシリアライゼーションがアプリケーションの奥深くに組み込まれているためです。

private static <T> T parseJson(Object source, Class<T> t) {

    TypeReference<T> ref = new TypeReference<T>() {
    };
    TypeFactory tf = TypeFactory.defaultInstance();

    //[...]

    obj = mapper.readValue((String) source, tf.constructType(ref));

    //[...]

    return obj;
}

私が望むものを達成できる注釈はありますか、それともマッパーコードを変更する必要がありますか?

前もって感謝します、マクファーレン

4

1 に答える 1

0

このリンクで説明されているようにTypeReference、の要点は、ジェネリック型引数を使用して型情報を取得することです。

内部的には、次のことを行います

Type superClass = getClass().getGenericSuperclass();
...
_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

wheregetActualTypeArguments()[0]は実際の型引数を提供します。この場合、メソッドのパラメーターにT何を渡すかに関係なく、それは変数型になります。Class<T> t

正しい使い方は、

TypeReference<List<Thing>> ref = new TypeReference<List<Thing>>() {};
...
List<Thing> thingsList = ...;
Things things = new Things();
things.setThings(thingsList);

つまり、いいえ、目的を達成するためにマッパー コードを変更する必要があります。

私の知る限り、ルート JSON 配列をクラスのプロパティとしてマップすることはできません。代替手段は、TypeReference上記の例またはここにある他のものです

于 2014-01-20T16:02:00.157 に答える