请注意:虽然此问题似乎与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中序列化/反序列化枚举的正确方法吗?
答案 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 { ... }