2016-04-29 21 views
1

Javaでenumの一部をシリアライズ/デシリアライズしようとするときに問題があります。ここに私の列挙型クラスです:パブリック列挙型をシリアル化/逆シリアル化する簡単な方法は?

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); 
    ... 
} 

私はFrequencyTypejsonとして入力に取るようにcreateFrequencyメソッドを使用しようとしています。ここに私の入力の例です。

{ 
    "frequencyType": "HOURLY" 
} 

私は私のREST APIを介してこのメ​​ソッドを呼び出すようにしようとしたときにしかし、私はというエラーを取得:

は「JSONを読み取れませんでした:デシリアライズすることはできません com.zuora.cds.api.schedule.FrequencyTypeがSTART_OBJECTトークンのうち[ソース:[email protected];行:1、列:1]; ネストされた例外は です。com.fasterxml .jackson.databind.JsonMappingException: com.zuora.cds.api.schedulingのインスタンスを逆シリアル化できませんe.Frequencyタイプ/START_OBJECTトークン\ n [ソース: [email protected];行:1、列:1]」、

私もそうようgetterssettersを追加しようとした私は、上記のJsonIncludeJsonIgnoreProperties annotationisに追加しようとしたが、それは助けていないようです:。

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); 
} 

POJO表現がうまくいけばFrequencyTypeにJSONを変換するだろうが、私は同じエラーを取得して終わるようにします。任意の助けをいただければ幸いです。ジャクソンに感謝します!

+0

てみ '{ "frequencyType":1}'、それは 'Serialize'は'動作しない場合あなたのライブラリーが何を期待しているかを見てください。 –

+0

@ElliottFrischさんは、 'FrequencyType'を' Serialize'するのが何を意味するか教えてください。最初の方法は機能しませんでした。 – user1871869

答えて

2

列挙型は一般的にシリアライズされるとJSON の文字列としてそのままシリアル化されています。

は、名前frequencyTypeを持つ単一の名前と値のペアとJSON文字列である値を持つJSONオブジェクトの列挙

{ 
    "frequencyType": "HOURLY" 
} 

としてJSONオブジェクトをデシリアライズしようとしています。

あなたはそれが中にいくつかの名前でラップしたいことを示し、このオブジェクトにあなたがおそらくあなたの列挙型に追加できるようになります

class FrequencyTypeWrapper { 
    private FrequencyType frequencyType; 

    // getters and setters 
} 

Jackson will eventually support a @JsonWrapped annotationをラップするPOJOを作成する必要がありますルートオブジェクト

代わりに、適切な変換を行うその列挙型に対して独自のJsonDeserializerを作成して登録することもできます。 JSONオブジェクトを解析し、名前と値のペアを抽出し、String値をenum値に変換します。あなたのコードでJSONに何かをデシリアライズしていない場合


、あなたはあなたのObjectMapperがルート値をアンラップするように設定することができます。

あなたの enumタイプのルート名を設定する必要があると思います
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 

同様

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

ああ、私はあなたが言っていることを見ている。ですから、私はこのようなクラスをいくつか作成します: 'public class FrequencyTypeWrapper { private FrequencyType frequencyType; \t public FrequencyType getFrequencyType(){ \t \t return frequencyType; \t} \t public void setFrequencyType(String frequencyType){ 文字列の結果= frequencyType; //解析の頻度タイプ... \t \t this.frequencyType = result; \t} } – user1871869

+0

@ user1871869はい、ハンドラメソッドのパラメータにその型を使用します。他にもオプションがありますが(すべての場合に有用ではないかもしれません)、私の編集をご覧ください。 –

+0

これは完全に機能しました。どうもありがとうございます! – user1871869

関連する問題