【发布时间】:2018-12-16 09:39:01
【问题描述】:
使用 Jackson 2.9.5,我将对象序列化为 JSON 并将其反序列化回 Java 对象。在反序列化 JSON 时,Jackson 抛出此异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of 'com.xxx.models.Header' out of START_ARRAY token
at [Source: (String)"{
"header" : [ "com.xxx.models.Header", {
"sourceAddress" : 0,
"destinationAddress" : 1, ...
这是半可以理解的,因为反序列化的 JSON 看起来像这样:
{
"header" : [ "com.xxx.models.Header", {
"sourceAddress" : 0,
"destinationAddress" : 1
]}
Jackson 在使用mapper.enableDefaultTyping()、mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE) 或mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS) 并调用writeValueAsString() 时添加数组语法。
但是在同一个对象映射器上调用 readValue() 来反序列化它刚刚生成的同一个 JSON 会引发上述异常。为什么? 我做错了什么?
我应该注意,如果我去掉添加的 [ "com.xxx.models.Header", 位(及其对应的数组终止符),JSON 将按预期进行解析,并且反序列化的对象已完全填充。
这似乎与多态性特别相关,所以这里是对象定义。 SerialMessage 包含 IHeader 和 IPayload。 Header 扩展了实现 IHeader 的 AbstractHeader,这是我正在序列化但无法反序列化的内容。
public class SerialMessage {
private IHeader header;
private IPayload payload;
public SerialMessage() {};
public SerialMessage(IHeader header) {
this.header = header;
}
public SerialMessage(IHeader header, IPayload payload) {
this(header);
this.payload = payload;
};
public IHeader getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
public IPayload getPayload() {
return payload;
}
public void setPayload(IPayload payload) {
this.payload = payload;
}
}
.
public class AbstractHeader implements IHeader {
protected short sourceAddress;
protected short destinationAddress;
public short getSourceAddress() {
return sourceAddress;
}
public void setSourceAddress(short sourceAddress) {
this.sourceAddress = sourceAddress;
}
public short getDestinationAddress() {
return destinationAddress;
}
public void setDestinationAddress(short destinationAddress) {
this.destinationAddress = destinationAddress;
}
}
.
public class Header extends AbstractHeader {
}
【问题讨论】:
-
你的 json 格式不正确,应该是 [{"key":"value"}]
-
@GauravSrivastav 我认为只有字符串值才能在 JSON 中引用。在我的情况下,这些值是数字。
-
“标题”怎么样:[“com.xxx.models.Header”,{...
-
@GauravSrivastav Jackson 在使用 mapper.enableDefaultTyping() 时添加了数组语法。它应该允许 Jackson 识别 JSON 应该被反序列化为哪个具体的类类型。