Eu tenho um Enum descrito abaixo:
public enum OrderType {
UNKNOWN(0, "Undefined"),
TYPEA(1, "Type A"),
TYPEB(2, "Type B"),
TYPEC(3, "Type C");
private Integer id;
private String name;
private WorkOrderType(Integer id, String name) {
this.id = id;
this.name = name;
}
//Setters, getters....
}
Devolvo a matriz enum com meu controlador ( new OrderType[] {UNKNOWN,TYPEA,TYPEB,TYPEC};
) e o Spring o serializa na seguinte string json:
["UNKNOWN", "TYPEA", "TYPEB", "TYPEC"]
Qual é a melhor abordagem para forçar Jackson a serializar enums exatamente como POJOs? Por exemplo:
[
{"id": 1, "name": "Undefined"},
{"id": 2, "name": "Type A"},
{"id": 3, "name": "Type B"},
{"id": 4, "name": "Type C"}
]
Joguei com anotações diferentes, mas não consegui obter esse resultado.
Respostas:
Finalmente encontrei a solução sozinho.
Tive que anotar enum
@JsonSerialize(using = OrderTypeSerializer.class)
e implementar serializador personalizado:fonte
disponível desde https://github.com/FasterXML/jackson-databind/issues/24
acabei de testar, funciona com a versão 2.1.2
resposta para TheZuck :
Eu tentei seu exemplo, peguei Json:
Meu código:
e as dependências são:
fonte
@JsonFormat
do enum quando ele é usado em outra entidade? por exemplo, uma entidade na qual desejo que o enum seja serializado como uma string em vez de um objeto. tento adicionar outro@JsonFormat
no campo da classe que usa o enum, mas sempre serializado como um objeto.Eu encontrei uma solução muito boa e concisa, especialmente útil quando você não pode modificar as classes enum como era no meu caso. Em seguida, você deve fornecer um ObjectMapper customizado com um determinado recurso ativado. Esses recursos estão disponíveis desde Jackson 1.6.
Existem mais recursos relacionados a enum disponíveis, veja aqui:
https://github.com/FasterXML/jackson-databind/wiki/Serialization-features https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
fonte
objMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
e isto:objMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
Aqui está minha solução. Eu quero transformar enum em
{id: ..., name: ...}
forma.Com Jackson 1.x :
pom.xml:
Rule.java:
NamedEnum.java:
NamedEnumJsonSerializer.java:
Com Jackson 2.x :
pom.xml:
Rule.java:
Rule.Status.CLOSED
traduzido para{id: "CLOSED", name: "closed rule"}
.fonte
Uma maneira fácil de serializar Enum é usando a anotação @JsonFormat. @JsonFormat pode configurar a serialização de um Enum de três maneiras.
usa OrderType :: name como o método de serialização. A serialização de OrderType.TypeA é
“TYPEA”
usa OrderType :: ordinal como o método de serialização. A serialização de OrderType.TypeA é
1
trata OrderType como um POJO. A serialização de OrderType.TypeA é
{"id":1,"name":"Type A"}
JsonFormat.Shape.OBJECT é o que você precisa no seu caso.
Uma maneira um pouco mais complicada é a sua solução, especificando um serializador para o Enum.
Confira esta referência: https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.html
fonte
Use a anotação @JsonCreator, crie o método getType (), é serializar com toString ou objeto funcionando
ou
...
fonte
No Spring Boot 2, a maneira mais fácil é declarar em seu application.properties:
e definir o método toString () de seus enums.
fonte