Jackson:枚举实例方法将值返回为字符串

时间:2014-11-20 20:59:08

标签: java serialization enums jackson

请注意:虽然此问题似乎this one类似但我问的问题略有不同。

我通过Jackson将POJO序列化/反序列化为JSON。

我正在尝试将UserStatus enum的实例很好地序列化(de)序列化并尝试通过:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
enum UserStatus {
    Unregistered,
    Activated,
    Deactivated,
    Locked

    @JsonValue
    String toValue() {
        // TODO: ???
    }
}

如果我对Jackson的理解是正确的,那么我的toValue()方法只需要弄清楚当前UserStatus实例的值,并将其转换为String。因此,UserStatus.Activated.toValue()应该为我们提供一个值为"Activated"的字符串。

主要问题:我如何做到这一点?

辅助问题:这是在Jackson-land中序列化/反序列化枚举的正确方法吗?

2 个答案:

答案 0 :(得分:1)

只需调用name()方法即可。见下面的例子:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

;

public class JacksonTest {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        mapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);

        Pojo pojo = new Pojo();
        pojo.userStatus = UserStatus.Activated;
        String json = mapper.writeValueAsString(pojo);
        System.out.println(json);
        Pojo deserializedPojo = mapper.readValue(json, Pojo.class);
        System.out.println("--");
        System.out.println(deserializedPojo);
    }

    public static class Pojo {
        public UserStatus userStatus;

        @Override
        public String toString() {
            return userStatus.name();
        }
    }

    @JsonIgnoreProperties(ignoreUnknown = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public enum UserStatus {
        Unregistered, Activated, Deactivated, Locked;

        @JsonValue
        public String toValue() {
            return name();
        }
    }
}

以上程序打印:

{
  "userStatus" : "Activated"
}
--
Activated

答案 1 :(得分:0)

从Jackson 2.1.2开始,您可以使用@JsonFormat注释来控制如何将Enum实例序列化为JSON字符串。

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum Type { ... }

请参阅http://www.baeldung.com/jackson-serialize-enums