Jackson ObjectMapper 反序列化包含对象数组的对象

Posted

技术标签:

【中文标题】Jackson ObjectMapper 反序列化包含对象数组的对象【英文标题】:Jackson ObjectMapper deserialize an object which contains an array of objects 【发布时间】:2021-10-05 12:01:25 【问题描述】:

我序列化这种对象:

public class MyObject implements Serializable 

private String type;
...
private String[] target;

//getters and setters

但是当我尝试反序列化 MyObject 时,由于 target 数组而出现错误。

java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: java.util.ArrayList[0]->MyObject["target"])
...

如何反序列化一个数组?

【问题讨论】:

杰克逊似乎试图反序列化一个字符串,而不是一个字符串数组。可能是setter方法出错了? 向我们展示你的 json,也许那里有错误。 感谢你们的帮助,我没有看到我有 2 个二传手。很抱歉 【参考方案1】:

我终于找到了问题所在。我没有看到班上有 2 个二传手。杰克逊可能用错了。

我只需将注释 @JsonSetter("target") 放在接受数组的 setter 上方,以告诉 Jackson 使用好的数组。

public void setTarget(String target) 
    this.target = new String[]target;


@JsonSetter("target")
public void setTarget(String[] target) 
    this.target = target;

【讨论】:

以上是关于Jackson ObjectMapper 反序列化包含对象数组的对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 com.fasterxml.jackson.databind.ObjectMapper 在序列化/反序列化 JSON 内容期间从异常日志中删除敏感数据

理解异常的麻烦:“无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例”在 Jackson 中使用 ObjectMapper

Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化

json之jackson序列化反序列化探究(二)

Spring Boot 自定义Jackson ObjectMapper

jackson中objectMapper的使用