J'ai un Enum décrit ci-dessous:
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....
}
Je retourne le tableau enum avec mon contrôleur ( new OrderType[] {UNKNOWN,TYPEA,TYPEB,TYPEC};
), et Spring le sérialise dans la chaîne json suivante:
["UNKNOWN", "TYPEA", "TYPEB", "TYPEC"]
Quelle est la meilleure approche pour forcer Jackson à sérialiser des énumérations comme les POJO? Par exemple:
[
{"id": 1, "name": "Undefined"},
{"id": 2, "name": "Type A"},
{"id": 3, "name": "Type B"},
{"id": 4, "name": "Type C"}
]
J'ai joué avec différentes annotations mais je n'ai pas réussi à obtenir un tel résultat.
Réponses:
Enfin j'ai trouvé la solution moi-même.
J'ai dû annoter enum
@JsonSerialize(using = OrderTypeSerializer.class)
et implémenter un sérialiseur personnalisé:la source
disponible depuis https://github.com/FasterXML/jackson-databind/issues/24
vient de tester cela fonctionne avec la version 2.1.2
réponse à TheZuck :
J'ai essayé votre exemple, j'ai obtenu Json:
Mon code:
et les dépendances sont:
la source
@JsonFormat
de l'énumération lorsqu'elle est utilisée dans une autre entité? par exemple, une entité dans laquelle je souhaite que l'énumération soit sérialisée sous forme de chaîne au lieu d'un objet. J'essaye d'en ajouter un autre@JsonFormat
dans le champ dans la classe qui utilise l'énumération mais il est toujours sérialisé en tant qu'objet.J'ai trouvé une solution très agréable et concise, particulièrement utile lorsque vous ne pouvez pas modifier les classes enum comme c'était le cas dans mon cas. Ensuite, vous devez fournir un ObjectMapper personnalisé avec une certaine fonctionnalité activée. Ces fonctionnalités sont disponibles depuis Jackson 1.6.
Il y a plus de fonctionnalités liées à l'énumération disponibles, voir ici:
https://github.com/FasterXML/jackson-databind/wiki/Serialization-features https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
la source
objMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
et ceci:objMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
Voici ma solution. Je veux que transform enum se
{id: ..., name: ...}
forme.Avec Jackson 1.x :
pom.xml:
Rule.java:
NamedEnum.java:
NamedEnumJsonSerializer.java:
Avec Jackson 2.x :
pom.xml:
Rule.java:
Rule.Status.CLOSED
traduit en{id: "CLOSED", name: "closed rule"}
.la source
Un moyen simple de sérialiser Enum consiste à utiliser l'annotation @JsonFormat. @JsonFormat peut configurer la sérialisation d'un Enum de trois manières.
utilise OrderType :: name comme méthode de sérialisation. La sérialisation de OrderType.TypeA est
“TYPEA”
utilise OrderType :: ordinal comme méthode de sérialisation. La sérialisation de OrderType.TypeA est
1
traite OrderType comme un POJO. La sérialisation de OrderType.TypeA est
{"id":1,"name":"Type A"}
JsonFormat.Shape.OBJECT est ce dont vous avez besoin dans votre cas.
Une manière un peu plus compliquée est votre solution, en spécifiant un sérialiseur pour Enum.
Consultez cette référence: https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.html
la source
Utilisez l'annotation @JsonCreator, créez la méthode getType (), sérialisez avec toString ou l'objet fonctionne
ou
...
la source
Dans Spring Boot 2, le moyen le plus simple est de déclarer dans votre application.properties:
et définissez la méthode toString () de vos énumérations.
la source