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 ?
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 ?
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.
Une solution avec Gson :
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(map);
MyPojo pojo = gson.fromJson(jsonElement, MyPojo.class);
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>>() {});
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
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 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.