Qual é a melhor maneira de converter um Json em um objeto Java com o uso do ObjectMapper? [duplicado]
Estou convertendo o objeto Java para o formato Json para salvá-los no banco de dados. Quando obtenho esses Jsons do banco de dados, preciso convertê-los em objetos de onde vieram. Para fazer isso, estou salvando os tipos de objetos e quando obtenho os Jsons do banco de dados, verifico seus tipos de objetos com as cláusulas if, mas acho que essa não é a melhor maneira de haver muitos objetos. Existe uma maneira mais simples de fazer isso?
Estrutura da tabela de banco de dados:
id | json_data | data_type
--------------------------
1 | "{a:1 ..} | TypeA
--------------------------
2 | so on.......
Exemplo de Java para converter Jsons em objetos Java:
ObjectMapper om = new ObjectMapper();
List<SpringEntityObject> allData = getAllDataFromDB();
for (SpringEntityObject o : allData) {
if (o.getDataType().equals("TypeA")) {
TypeA typeA = om.readValue(o.getJsonData(), TypeA.class);
// there should be a simpler way to do this?
....
} else if (o.getDataType().equals("TypeB")) {
TypeB typeB = om.readValue(o.getJsonData(), TypeB.class);
....
} ......
else {....}
}
Respostas
O principal problema que você pode ter é que você precisa alterar este bloco de código cada vez que adiciona uma nova classe.
Você pode armazenar o nome completo (com espaço de nomes) da classe na coluna "data_type" e usar Class.forName para obter a classe dinamicamente. Isso permite adicionar classes sem alterar o código de desserialização, o que ajuda na manutenção.
for (SpringEntityObject o : allData) {
Class clazz = Class.forName(o.getDataType());
Object deserializedObject = om.readValue(o.getJsonData(), clazz);
}
Observe que você precisará sincronizar os nomes das classes no banco de dados se renomeá-los / movê-los (por meio de um script de migração).