2016-08-10 6 views
0

私は複数のカスタム属性を持つ列挙型を持っています。私はそれをシリアル化することができるよ、と私はそれをデシリアライズする@JsonCreatorメソッドを作成しましたが、それは働いていない:JsonDeserializerを手で動かすことなく、ジャクソンで複雑なカスタム列挙型をデシリアライズする方法は?

import com.fasterxml.jackson.annotation.*; 
import com.fasterxml.jackson.databind.JsonNode; 

@JsonFormat(shape = JsonFormat.Shape.OBJECT) 
public enum SomeEnum { 
    SOME_VALUE("Blah blah blah", "Example description"); 

    private final String displayName; 
    private final String description; 

    ScheduleOptimizationRuleCode(String displayName, String description) { 
     this.displayName = displayName; 
     this.description = description; 
    } 

    public String getCode() { return this.name(); } 

    public String getDisplayName() { 
     return displayName; 
    } 

    public String getDescription() { 
     return description; 
    } 

    @JsonCreator 
    public static SomeEnum fromString(@JsonProperty("code") String value) { 
     return SomeEnum.valueOf(value); 
    } 
} 

シリアル化するとき、私は以下の(正しい)出力を得る:

{ 
    "code": "SOME_VALUE", 
    "displayName": "Blah blah blah", 
    "description": "Example description" 
} 

デシリアライズすると、ジャクソンはJSON文字列のオブジェクト表現を見て、code属性を調べ、@JsonCreator注釈付きメソッドfromString()に文字列として渡しますが、機能しません。 valueは常にnullです。

@JsonCreatorアノテーション(例:PROPERTIESDELEGATING)で「モード」を設定しようとしましたが、機能しません。私が見たすべての例は単一の価値しか持っていないので、この問題はありません。

どのように...

は、私は私が...とジャクソンのdocにJsonDeserializerとワイヤーを手でロールバックすることができます知っているが、確かにこれは私が手作りデシリアライザが必要であることをそれほど複雑ではありません複数の属性を持つ列挙型を逆シリアル化しますか?

答えて

0

最後にexample of deserializing an enumが見つかりましたが、2つの例のうち1つのみが動作します。彼のenumを見て、彼はJsonNodeを渡しているのを見た。チャームのように働いた!

@JsonCreator 
public static SomeEnum fromString(JsonNode json) { 
    return SomeEnum.valueOf(json.get("code").asText()); 
} 
関連する問題