从其字符串表示中反序列化 POJO 数组成员

Deserialise POJO array member from its string representation

我正在寻找一种通用的方法来使用 Jackson a JSON 进行反序列化,例如:

{
    "hello": "baby",
    "eyes": "[blue,green]"
}

到 POJO,例如

public class Whatever {
    @Setter private String hello;
    @Setter private List<Color> eyes;
}

Color 是一个枚举。

当我像下面这样天真地尝试时:

ObjectMapper mapper = new ObjectMapper();
mapper.convertValue(properties, objectClass);

我收到错误

Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token

显然这是因为 Jackson 只能从 JSON 数组反序列化数组,而不是它们的字符串表示形式。

我试图激活 ACCEPT_SINGLE_VALUE_AS_ARRAY 但它会将 属性 "eyes" 的值视为具有单个字符串元素“[blue,green]”的数组(其中无法转换为枚举 Color)

任何提示将不胜感激。

问题不在于 ACCEPT_SINGLE_VALUE_AS_ARRAY 导致 "eyes" 属性 被解释为具有单个元素的数组,该选项允许 Jackson 强制类型,以便

{
  "hello": "baby",
  "eyes": "[blue,green]"
}

的解释相同
[{
  "hello": "baby",
  "eyes": "[blue,green]"
}]

通过这种方式,单个元素可以与 Java 的集合一起使用,可以在

找到更多信息

http://fasterxml.github.io/jackson-databind/javadoc/2.0.0/com/fasterxml/jackson/databind/DeserializationFeature.html#ACCEPT_SINGLE_VALUE_AS_ARRAY

就您的问题而言,最好的选择是将 JSON 与颜色作为 JSON 数组提交,例如:

{
  "hello": "baby",
  "eyes": [
    "blue",
    "green",
  ]
}

否则你可能需要让你的 Whatever class 在带有 String 参数的 setEyes 方法上有 @JsonSetter 注释,你在其中解析 String 以手动创建Color 你自己的名单。

@JsonSetter
public void setEyes(final String eyes) {
    // Parse string and set field here
}