web-dev-qa-db-fra.com

Comment désérialiser une carte <String, Object> dans POJO?

J'ai une carte <String, Object> qui contient une forme désérialisée de JSON. Je voudrais désérialiser ceci dans les champs d'un POJO.

Je peux effectuer cela en utilisant Gson en sérialisant la carte dans une chaîne JSON puis en désérialisant la chaîne JSON dans le POJO, mais cela est inefficace (voir l'exemple ci-dessous). Comment puis-je effectuer ceci sans l'étape intermédiaire?

La solution doit utiliser de préférence Gson ou Jackson, car ils sont déjà utilisés par le projet.

Exemple de code:

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 + "]";
    }
}
13
Sampo

En utilisant Gson, vous pouvez transformer votre carte en une JsonElement, que vous pouvez ensuite analyser exactement de la même manière en utilisant fromJson:

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

Cette méthode est similaire à la méthode toJson que vous utilisez déjà, sauf qu’elle évite d’écrire la représentation de chaîne JSON, puis d’analyser cette chaîne JSON en un JsonElement avant de la convertir en classe.

21
andersschuller

Dans Jackson, vous pouvez utiliser convertValue method. Voir ci-dessous exemple:

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

Vous pouvez utiliser la bibliothèque jackson pour convertir un objet cartographique en direct 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);
1
user1759579

Vous pouvez construire directement MyPojo en lui donnant la carte . 

MyPojo pojo = new MyPojo(map);

Et en déclarant un constructeur suivant:

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");
}
1
user1191976