Ich habe eine Enum unten beschrieben:
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....
}
Ich gebe mit meinem Controller ( new OrderType[] {UNKNOWN,TYPEA,TYPEB,TYPEC};
) ein Enum-Array zurück und Spring serialisiert es in den folgenden JSON-String:
["UNKNOWN", "TYPEA", "TYPEB", "TYPEC"]
Was ist der beste Ansatz, um Jackson zu zwingen, Enums genau wie POJOs zu serialisieren? Z.B:
[
{"id": 1, "name": "Undefined"},
{"id": 2, "name": "Type A"},
{"id": 3, "name": "Type B"},
{"id": 4, "name": "Type C"}
]
Ich habe mit verschiedenen Anmerkungen gespielt, konnte aber kein solches Ergebnis erzielen.
Antworten:
Endlich habe ich selbst eine Lösung gefunden.
Ich musste enum mit dem
@JsonSerialize(using = OrderTypeSerializer.class)
benutzerdefinierten Serializer kommentieren und implementieren:quelle
verfügbar seit https://github.com/FasterXML/jackson-databind/issues/24
gerade getestet funktioniert es mit Version 2.1.2
Antwort auf TheZuck :
Ich habe dein Beispiel ausprobiert und Json verstanden:
Mein Code:
und Abhängigkeiten sind:
quelle
@JsonFormat
der Aufzählung überschreiben, wenn sie in einer anderen Entität verwendet wird? Zum Beispiel eine Entität, in der ich möchte, dass die Aufzählung als Zeichenfolge anstelle eines Objekts serialisiert wird. Ich versuche, ein weiteres@JsonFormat
Feld in der Klasse hinzuzufügen, das die Aufzählung verwendet, aber es wird immer als Objekt serialisiert.Ich habe eine sehr schöne und prägnante Lösung gefunden, die besonders nützlich ist, wenn Sie die Enum-Klassen nicht wie in meinem Fall ändern können. Anschließend sollten Sie einen benutzerdefinierten ObjectMapper mit einer bestimmten aktivierten Funktion bereitstellen. Diese Funktionen sind seit Jackson 1.6 verfügbar.
Weitere enumbezogene Funktionen sind verfügbar, siehe hier:
https://github.com/FasterXML/jackson-databind/wiki/Serialization-features https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
quelle
objMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
und dies:objMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
Hier ist meine Lösung. Ich möchte, dass sich die Aufzählung verwandelt
{id: ..., name: ...}
.Mit Jackson 1.x :
pom.xml:
Rule.java:
NamedEnum.java:
NamedEnumJsonSerializer.java:
Mit Jackson 2.x :
pom.xml:
Rule.java:
Rule.Status.CLOSED
übersetzt in{id: "CLOSED", name: "closed rule"}
.quelle
Eine einfache Möglichkeit, Enum zu serialisieren, ist die Verwendung der Annotation @JsonFormat. @JsonFormat kann die Serialisierung einer Aufzählung auf drei Arten konfigurieren.
verwendet OrderType :: name als Serialisierungsmethode. Serialisierung von OrderType.TypeA ist
“TYPEA”
verwendet OrderType :: ordinal als Serialisierungsmethode. Serialisierung von OrderType.TypeA ist
1
behandelt OrderType als POJO. Serialisierung von OrderType.TypeA ist
{"id":1,"name":"Type A"}
JsonFormat.Shape.OBJECT ist das, was Sie in Ihrem Fall benötigen.
Etwas komplizierter ist Ihre Lösung, indem Sie einen Serializer für die Enum angeben.
Überprüfen Sie diese Referenz: https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonFormat.html
quelle
Verwenden Sie die Annotation @JsonCreator, erstellen Sie die Methode getType (), serialisieren Sie mit toString oder arbeiten Sie mit Objekten
oder
...
quelle
In Spring Boot 2 ist es am einfachsten, in Ihrer application.properties zu deklarieren:
und definieren Sie die toString () -Methode Ihrer Aufzählungen.
quelle