用Jackson反序列化枚举

我正在尝试并且未能对Jackson 2.5.4的枚举进行反序列化,并且我不太清楚我的情况。我的输入字符串是驼峰式的,我想简单地映射到标准的Enum约定。

@JsonFormat(shape = JsonFormat.Shape.STRING)

public enum Status {

READY("ready"),

NOT_READY("notReady"),

NOT_READY_AT_ALL("notReadyAtAll");

private static Map<String, Status> FORMAT_MAP = Stream

.of(Status.values())

.collect(toMap(s -> s.formatted, Function.<Status>identity()));

private final String formatted;

Status(String formatted) {

this.formatted = formatted;

}

@JsonCreator

public Status fromString(String string) {

Status status = FORMAT_MAP.get(string);

if (status == null) {

throw new IllegalArgumentException(string + " has no corresponding value");

}

return status;

}

}

我也尝试@JsonValue了吸气剂,但没有成功,这是我在其他地方看到的一种选择。他们都炸毁了:

com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of ...Status from String value 'ready': value not one of declared Enum instance names: ...

我究竟做错了什么?

回答:

从Jackson

2.6开始,您可以@JsonProperty在枚举的每个元素上使用以指定其序列化/反序列化值(请参见此处):

public enum Status {

@JsonProperty("ready")

READY,

@JsonProperty("notReady")

NOT_READY,

@JsonProperty("notReadyAtAll")

NOT_READY_AT_ALL;

}


(此答案的其余部分仍然适用于旧版本的Jackson)

您应该@JsonCreator用来注释接收String参数的静态方法。那就是杰克逊所谓的 工厂方法

public enum Status {

READY("ready"),

NOT_READY("notReady"),

NOT_READY_AT_ALL("notReadyAtAll");

private static Map<String, Status> FORMAT_MAP = Stream

.of(Status.values())

.collect(Collectors.toMap(s -> s.formatted, Function.identity()));

private final String formatted;

Status(String formatted) {

this.formatted = formatted;

}

@JsonCreator // This is the factory method and must be static

public static Status fromString(String string) {

return Optional

.ofNullable(FORMAT_MAP.get(string))

.orElseThrow(() -> new IllegalArgumentException(string));

}

}

这是测试:

ObjectMapper mapper = new ObjectMapper();

Status s1 = mapper.readValue("\"ready\"", Status.class);

Status s2 = mapper.readValue("\"notReadyAtAll\"", Status.class);

System.out.println(s1); // READY

System.out.println(s2); // NOT_READY_AT_ALL

正如工厂方法所期望的那样String,您必须对字符串使用JSON有效语法,该语法必须带有引号。

以上是 用Jackson反序列化枚举 的全部内容, 来源链接: utcz.com/qa/419300.html

回到顶部