2016-04-29 13 views
1

Ich habe einige Probleme beim Versuch, einige enum in Java serialisieren/deserialisieren. Hier ist meine Enum Klasse:Einfache Möglichkeit, öffentliche enums zu serialisieren/deserialisieren?

FrequencyType.java:

@JsonInclude(Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown = true) 
public enum FrequencyType { 
    NONE, 
    HOURLY, 
    DAILY, 
    WEEKLY, 
    MONTHLY; 
} 

Controller.java

@RequestMapping(method = RequestMethod.POST) 
public Object createFrequency(@RequestBody FrequencyType frequencyType) throws Exception { 
    ... 
    frequencyManager.createFrequency(frequencyType); 
    ... 
} 

Ich versuche, die createFrequency Methode zu verwenden, in einem FrequencyType als json Eingang zu nehmen. Hier ist ein Beispiel für meine Eingabe:

{ 
    "frequencyType": "HOURLY" 
} 

Jedes Mal, wenn ich versuche, diese Methode über meine REST-API aufzurufen, erhalte ich eine Fehlermeldung, dass:

„konnte nicht JSON lesen: Kann nicht deserialisieren Instanz com.zuora.cds.api.schedule.FrequencyType aus START_OBJECT Token \ n an [Quelle: [email protected]; line: 1, Säule: 1]; verschachtelte Ausnahme ist com.fasterxml .jackson.databind.JsonMappingException: Kann Instanz von com.zuora.cds.api.schedul nicht deserialisieren e.FrequencyType aus von START_OBJECT Token \ n um [Quelle: [email protected]; Zeile: 1, Spalte:. 1]“,

Ich habe in den oben JsonInclude und JsonIgnoreProperties annotationis hinzuzufügen versucht, aber das scheint nicht Ich habe auch versucht getters und setters wie so hinzuzufügen, zu helfen:

FrequencyType getNone() { 
    return FrequencyType.NONE; 
} 
FrequencyType getHourly() { 
    return FrequencyType.HOURLY; 
} 
FrequencyType getDaily() { 
    return FrequencyType.DAILY; 
} 
FrequencyType getWeekly() { 
    return FrequencyType.WEEKLY; 
} 
FrequencyType getMonthly() { 
    return FrequencyType.MONTHLY; 
} 
void setNone(FrequencyType frequencyType) { 
    this.equals(frequencyType); 
} 
void setHourly(FrequencyType frequencyType) { 
    this.equals(frequencyType); 
} 
void setDaily(FrequencyType frequencyType) { 
    this.equals(frequencyType); 
} 
void setWeekly(FrequencyType frequencyType) { 
    this.equals(frequencyType); 
} 
void setMonthly(FrequencyType frequencyType) { 
    this.equals(frequencyType); 
} 

, so dass die POJO Darstellung hoffentlich die JSON in eine FrequencyType verwandeln würde, aber ich am Ende den gleichen Fehler. Jede mögliche Hilfe würde geschätzt. Dank!

+0

Try '{ "frequencyType": 1}', wenn das nicht 'Serialize' funktioniert ein' FrequencyType' und sehen Sie, was Ihre Bibliothek erwartet. –

+0

@ElliottFrisch Könntest du näher erläutern, was du mit "Serialisieren" und "FrequencyType" anfangen willst? Die erste Methode hat nicht funktioniert. – user1871869

Antwort

2

Enum-Typen in Jackson sind in der Regel serialisiert und deserialisiert roh, wie JSON Strings.

Sie versuchen, ein JSON-Objekt als Enum mit einem Paar Einzel Name-Wert-

{ 
    "frequencyType": "HOURLY" 
} 

Das ist ein JSON-Objekt deserialisiert mit Namen frequencyType und einem Wert, der ein JSON-String ist.

Sie erhalten eine POJO erstellen müssen, um dieses Objekt zu wickeln

class FrequencyTypeWrapper { 
    private FrequencyType frequencyType; 

    // getters and setters 
} 

Jackson will eventually support a @JsonWrapped annotation, die Sie wahrscheinlich in der Lage sein werden, um Ihre Enum-Typ hinzuzufügen, was darauf hinweist, dass Sie es wollen mit einigen Namen gewickelt werden in ein Wurzelobjekt.

Die Alternative besteht darin, Ihre eigene für diesen Aufzählungstyp zu schreiben und zu registrieren, der die entsprechende Konvertierung durchführt, dh. Analysiert ein JSON-Objekt, extrahiert ein Name-Wert-Paar und konvertiert den String-Wert in einen Enum-Wert.


Wenn Sie nichts anderes zu JSON in Ihrem Code Deserialisieren können Sie konfigurieren Ihr ObjectMapper den Wurzelwert auszupacken.

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 

Sie müßten die Stammnamen für Ihren enum Typen konfigurieren sowie

@JsonRootName("frequencyType") 
enum FrequencyType { 
    HOURLY /* more */; 
} 
+0

Ah ich sehe was du sagst. Also würde ich irgendeine Klasse so etwas wie diese machen: 'public class FrequencyTypeWrapper { private FrequencyType frequencyType; \t Öffentlicher FrequencyType getFrequencyType() { \t \t RücklauffrequenzTyp; \t} \t öffentliche void setFrequencyType (String frequencyType) { String result = frequencyType; // Parse frequencyType ... \t \t this.frequencyType = Ergebnis; \t} } ' – user1871869

+0

@ user1871869 Ja, und Sie würden diesen Typ für den Parameter Ihrer Handler-Methode verwenden. Es gibt andere Optionen (aber sie sind möglicherweise nicht in allen Fällen nützlich), siehe meine Bearbeitung. –

+0

Das hat perfekt funktioniert. Ich danke dir sehr! – user1871869

Verwandte Themen