Início > Programação > Como Criar um Serializador e um Deserializador com o Jackson

Como Criar um Serializador e um Deserializador com o Jackson

Gravar um arquivo em formato JSON utilizando Jackson é simples:

public class AtividadeRepository
       public void salvar(List<Atividade> atividades) throws JsonGenerationException,
JsonMappingException, IOException {
		ObjectMapper mapper = new ObjectMapper();
		mapper.enable(SerializationFeature.INDENT_OUTPUT);
		mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
		mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
		File file = new File("atividade.json");
		mapper.writeValue(file, entitities);
       }
}

A classe Atividade é assim:

public class Atividade {
	
        @JsonProperty("nome")
        private String nome;

        @JsonProperty("status")
        private Status status;

}

A enum Status é assim:

public enum Status  {
	INICIADO, EXECUTANDO, FINALIZADO;
}

O arquivo JSON gerado é como o que segue:

[ {
  "nome" : "AUDITORIA INTERNA",
  "status" : "FINALIZADO"
}, {
  "nome" : "PROJETO DE MIGRAÇÃO",
  "status" : "EXECUTANDO"
}, {
  "nome" : "ANÁLISE DE REQUISITOS",
  "status" : "INICIADO"
} ]

O problema dessa abordagem está no tipo enumerado Status. O ObjectMapper gravará a representação alfanumérica da enum e fará a conversão de tipo quando o arquivo for lido, porém, se o status “EXECUTANDO” for renomeado para “EXECUCAO”, não será possível recuperar o tipo correto.

Para resolver esse problema, pode-se atribuir um identificador único ao enum e criar um JsonSerializer e um JsonDeserializer para, respectivamente, armazenar o identificador do tipo ao invés da representação e utilizar o identificador para recuperar o tipo:

public class StatusSerializer extends JsonSerializer<Status> {

	@Override
	public void serialize(Status status, JsonGenerator generator, SerializerProvider provider)
              throws IOException, JsonProcessingException {
		generator.writeNumber(status.getId());
	}
}
public class StatusDeserializer extends JsonDeserializer<Status> {

	@Override
	public Status deserialize(JsonParser parser, DeserializationContext context)
             throws IOException, JsonProcessingException {
		int id = parser.getIntValue();
		for (Status status: Status.values()) {
			if (status.getId().equals(id)) {
				return status;
			}
		}
		return null;
	}
}

Por último, basta anotar o enum:

@JsonSerialize(using = StatusSerializer.class)
@JsonDeserialize(using = StatusDeserializer.class)
public enum Status  {
	INICIADO(1), EXECUTANDO(2), FINALIZADO(2);

        private Integer id;

        private TipoAgrupamento(Integer id) {
             this.id = id;
        }

        public Integer getId(){
             return id;
        }
}

O JSON terá o seguinte formato:

[ {
  "nome" : "AUDITORIA INTERNA",
  "status" : 3
}, {
  "nome" : "PROJETO DE MIGRAÇÃO",
  "status" : 2
}, {
  "nome" : "ANÁLISE DE REQUISITOS",
  "status" : 1
} ]
Anúncios
  1. Nenhum comentário ainda.
  1. 03/03/2016 às 9:09 AM

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: