Qual é a melhor maneira de converter um Json em um objeto Java com o uso do ObjectMapper? [duplicado]

Nov 03 2020

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

3 SherifBehna Nov 03 2020 at 20:59

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).