4

Jackson 2 を使用して次の列挙型に逆シリアル化する方法のような JSON があるとします{statusCode:401}。主な問題は、逆シリアル化では、説明ではなくステータス コードしかないことです。

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 を構成するにはどうすればよいですか?

4

1 に答える 1

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);
    }
}
于 2012-09-20T21:40:18.390 に答える