web-dev-qa-db-ja.com

Map <String、Object>をPOJOに逆シリアル化する方法は?

JSONの逆シリアル化された形式を含むMap <String、Object>があります。これをPOJOのフィールドに逆シリアル化したいと思います。

MapをJSON文字列にシリアル化し、JSON文字列をPOJOに逆シリアル化することで、Gsonを使用してこれを実行できますが、これは非効率的です(以下の例を参照)。中間ステップなしでこれを実行するにはどうすればよいですか?

ソリューションは、プロジェクトですでに使用されているため、GsonまたはJacksonのいずれかを使用する必要があります。

コード例:

import Java.util.HashMap;
import Java.util.Map;

import com.google.gson.Gson;

public class Test {
    public static void main(String[] args) {
        Map<String, Object> innermap = new HashMap<String, Object>();
        innermap.put("number", 234);
        innermap.put("string", "bar");
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("number", 123);
        map.put("string", "foo");
        map.put("pojo2", innermap);

        Gson gson = new Gson();

        // How to perform this without JSON serialization?
        String json = gson.toJson(map);
        MyPojo pojo = gson.fromJson(json, MyPojo.class);

        System.out.println(pojo);
    }
}


class MyPojo {
    private int number;
    private String string;
    private MyPojo pojo2;

    @Override
    public String toString() {
        return "MyPojo[number=" + number + ", string=" + string + ", pojo2=" + pojo2 + "]";
    }
}
18
Sampo

Gsonを使用すると、マップをJsonElementに変換でき、fromJsonを使用してまったく同じ方法で解析できます。

JsonElement jsonElement = gson.toJsonTree(map);
MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);

これは、すでに使用しているtoJsonメソッドに似ていますが、JSON文字列表現の書き込みを回避し、クラスに変換する前にそのJSON文字列を解析してJsonElementに戻すことを除きます。

29
andersschuller

Jacksonでは convertValue メソッドを使用できます。以下の例を参照してください:

mapper.convertValue(map, MyPojo.class);
16
Michał Ziober

ジャクソンライブラリを使用して、マップオブジェクトを直接POJOに変換できます。

Map<String, String> map = new HashMap<>();
map.put("id", "5");
map.put("name", "Bob");
map.put("age", "23");
map.put("savings", "2500.39");

ObjectMapper mapper = new ObjectMapper();
MyPojo pojo = mapper.convertValue(map, MyPojo.class);
5

MyPojoにマップを与えることで、直接構築できます。何かのようなもの

MyPojo pojo = new MyPojo(map);

そして、一致するコンストラクタを宣言します:

public MyPojo(Map<String, Object> map){
  this.number=map.get("number");
  this.string=map.get("string");
  this.pojo2=new MyPojo(); // I don't know if this is possible
  this.pojo2.string=map.get("pojo2").get("string");
  this.pojo2.number=map.get("pojo2").get("number");
}
0
user1191976