2012-09-20 63 views
4

給定一個看起來像{statusCode:401}的JSON,我怎麼能將它反序列化爲Jackson 2的以下枚舉:主要問題是在反序列化中,我只有狀態碼而不是描述。如何在Jackson2中使用多參數構造函數反序列化Enum?

public enum RestApiHttpStatus 
{ 
    OK(200, "Ok"), 
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"), 
    BAD_REQUEST(400, "Bad Request"), 
    UNAUTHORIZED(401, "Unauthorized"), 
    FORBIDDEN(403, "Forbidden"), 
    NOT_FOUND(404, "Not Found"); 

    private final int statusCode; 
    private final String description; 

    private RestApiHttpStatus(int statusCode, String description) 
    { 
     this.statusCode = statusCode; 
     this.description = description; 
    } 

    public int getStatusCode() 
    { 
     return statusCode; 
    } 

    public String getDescription() 
    { 
     return description; 
    } 
} 

如何配置Jackson2來應對這種情況?

+1

你看看這個:http://wiki.fasterxml.com/JacksonHowToCustomDeserializers? – Vikdor

回答

2

添加以下用適當的Jackson註釋註釋的靜態工廠方法是一個絕招。

@JsonCreator 
public static RestApiHttpStatus valueOf(@JsonProperty("statusCode") int statusCode) 
{ 
    if (RestApiHttpStatus.FORBIDDEN.getStatusCode() == statusCode) 
    { 
     return RestApiHttpStatus.FORBIDDEN; 
    } else if (RestApiHttpStatus.NOT_FOUND.getStatusCode() == statusCode) 
    { 
     return RestApiHttpStatus.NOT_FOUND; 
    } else if (RestApiHttpStatus.INTERNAL_SERVER_ERROR.getStatusCode() == statusCode) 
    { 
     return RestApiHttpStatus.INTERNAL_SERVER_ERROR; 
    } else if (RestApiHttpStatus.BAD_REQUEST.getStatusCode() == statusCode) 
    { 
     return RestApiHttpStatus.BAD_REQUEST; 
    } else if (RestApiHttpStatus.UNAUTHORIZED.getStatusCode() == statusCode) 
    { 
     return RestApiHttpStatus.UNAUTHORIZED; 
    } else if (RestApiHttpStatus.OK.getStatusCode() == statusCode) 
    { 
     return RestApiHttpStatus.OK; 
    } else 
    { 
     throw new IllegalArgumentException("Invlaid RestApiStatus Code " + statusCode); 
    } 
} 
相關問題