0

私はこの構造を持っています

 List<Map<String, Object>>

またはそれを包むことができます

   public static  class TestWrapper {
    List<Map<String, Object>> list;

    public TestWrapper() {
    }

    public List<Map<String, Object>> getList() {
        return list;
    }

    public void setList(List<Map<String, Object>> list) {
        this.list = list;
    }
   }

Jackson は、値をどのタイプのオブジェクトにデシリアライズして Map 値にするかをどのように知るのでしょうか? 構成可能な場合、注釈を使用するように構成するにはどうすればよいですか?

4

1 に答える 1

1

以下のクラスと JSON 文字列の例を使用して、それがどのように機能するかを説明しましょう。以下のような 2 つのクラスがあるとします。

class TestWrapper<T> {

    private List<Map<String, T>> list = new ArrayList<Map<String, T>>();

    public List<Map<String, T>> getList() {
        return list;
    }

    public void setList(List<Map<String, T>> list) {
        this.list = list;
    }
}

class Entity {

    private long id;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }
}

入力としてのJSON文字列の下:

{
  "list" : [ {
    "entity" : {
      "id" : 0
    }
  } ]
}

以下のコードを使用して上記の JSON を逆シリアル化しようとすると、Jackson が不明な型をMapクラスに逆シリアル化することがわかります。

TestWrapper<?> result = mapper.readValue(json, TestWrapper.class);
System.out.println(result.getList().get(0).get("entity").getClass());

上記のプログラムは次のように出力します:

class java.util.LinkedHashMap

値のタイプを定義したい場合は、JSON デシリアライゼーション プロセスを使用しMapてビルドし、提供する必要があります。TypeFactory

TypeFactory typeFactory = mapper.getTypeFactory();
JavaType type = typeFactory.constructParametricType(TestWrapper.class, Entity.class);

TestWrapper<Entity> result = mapper.readValue(json, type);
System.out.println(result.getList().get(0).get("entity").getClass());

上記のプログラムは次のように出力します:

class your.package.Entity

ご覧のとおり、複雑なオブジェクトを提供するジェネリック型をJavaType逆シリアル化プロセスに提供できます。

于 2013-07-31T22:15:35.147 に答える