262 votes

Conversion d'une Map<String, String> en POJO

J'ai regardé Jackson, mais il semble que je doive convertir la carte en JSON, puis le JSON résultant en POJO.

Existe-t-il un moyen de convertir une carte directement en POJO ?

491voto

Jongwook Choi Points 2643

Eh bien, vous pouvez y parvenir avec Jackson, aussi. (et cela semble être plus confortable puisque vous envisagiez d'utiliser Jackson).

Utilisez ObjectMapper 's convertValue méthode :

final ObjectMapper mapper = new ObjectMapper(); // jackson's objectmapper
final MyPojo pojo = mapper.convertValue(map, MyPojo.class);

Il n'est pas nécessaire de convertir en chaîne JSON ou autre ; la conversion directe est beaucoup plus rapide.

75voto

Une solution avec Gson :

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

7voto

bhdrk Points 570

Si vous avez des types génériques dans votre classe, vous devez utiliser TypeReference con convertValue() .

final ObjectMapper mapper = new ObjectMapper();
final MyPojo<MyGenericType> pojo = mapper.convertValue(map, new TypeReference<MyPojo<MyGenericType>>() {});

Vous pouvez également l'utiliser pour convertir un pojo en java.util.Map arrière.

final ObjectMapper mapper = new ObjectMapper();
final Map<String, Object> map = mapper.convertValue(pojo, new TypeReference<Map<String, Object>>() {});

5voto

Shafeeq Mohammed Points 120
 ObjectMapper objectMapper = new ObjectMapper();
 //if all properties are not in class use this
 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 final MyPojo pojo =     objectMapper.convertValue(map, MyPojo.class);

même réponse que la première, mais j'ai eu une erreur en utilisant cette méthode car je ne veux pas que toutes les propriétés de la carte soient converties en appels. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ceci est la solution

4voto

Perception Points 42290

Oui, il est tout à fait possible d'éviter la conversion intermédiaire en JSON. En utilisant un outil de copie profonde comme Dozer vous pouvez convertir la carte directement en POJO. Voici un exemple simpliste :

Exemple de POJO :

public class MyPojo implements Serializable {
    private static final long serialVersionUID = 1L;

    private String id;
    private String name;
    private Integer age;
    private Double savings;

    public MyPojo() {
        super();
    }

    // Getters/setters

    @Override
    public String toString() {
        return String.format(
                "MyPojo[id = %s, name = %s, age = %s, savings = %s]", getId(),
                getName(), getAge(), getSavings());
    }
}

Exemple de code de conversion :

public class CopyTest {
    @Test
    public void testCopyMapToPOJO() throws Exception {
        final Map<String, String> map = new HashMap<String, String>(4);
        map.put("id", "5");
        map.put("name", "Bob");
        map.put("age", "23");
        map.put("savings", "2500.39");
        map.put("extra", "foo");

        final DozerBeanMapper mapper = new DozerBeanMapper();
        final MyPojo pojo = mapper.map(map, MyPojo.class);
        System.out.println(pojo);
    }
}

Sortie :

MonPojo [id = 5, nom = Bob, âge = 23, épargne = 2500.39]

Remarque : Si vous changez votre carte source en une carte de type Map<String, Object> vous pouvez alors copier des propriétés imbriquées à une profondeur arbitraire (avec le paramètre Map<String, String> vous n'obtenez qu'un seul niveau).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X