Jackson JSON 强制反序列化到对象
Jackson JSON force deserialize to object
我得到了一个 class 委托设置
public class MyClass implements List<Integer> {
public String name;
public List<Integer> target; // this is the delegation target
// more fields
@Override
public Integer get(int index) {
return target.get(index);
}
// all other method in target interface is delegated
}
我得到了一个 JSON,看起来像这样:
{"target": [1, 2, 3] , "name":"foo"}
杰克逊抛出了这个:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.foo.MyClass out of START_OBJECT token
at [Source: java.io.StringReader@156e5f3e; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:691)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:685)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:256)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:214)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:204)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2986)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2091)
我推测 Jackson 认为 MyClass 是一个列表所以不知道如何处理 {}
因为 []
是预期的
我通过使 MyClass
未实现 List<Integer>
来证实我的推测:
public class MyClass { /*same stuff*/}
一切正常。但是我需要 MyClass 来实现 List<Integer>
.....
我可以使用模块中的注释或配置来解决这个问题吗?
您或许可以编写一个自定义反序列化器,但我真的认为如果您删除 List 继承,问题会得到更好的解决。
实现该接口有什么要求?对于您的顶级 class 来说,拥有一个列表访问器而不是实现一个接口不是更有意义吗?从面向对象的角度来看,您的顶级 class 不是 "kind of" 列表。删除继承,您将拥有与 Jackson 一起使用的更简洁的设计。
我在阅读 this article 时偶然发现了我的答案,
基本上,我需要用
注释我的 class
@JsonFormat(shape = Shape.OBJECT)
我得到了一个 class 委托设置
public class MyClass implements List<Integer> {
public String name;
public List<Integer> target; // this is the delegation target
// more fields
@Override
public Integer get(int index) {
return target.get(index);
}
// all other method in target interface is delegated
}
我得到了一个 JSON,看起来像这样:
{"target": [1, 2, 3] , "name":"foo"}
杰克逊抛出了这个:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.foo.MyClass out of START_OBJECT token
at [Source: java.io.StringReader@156e5f3e; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:691)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:685)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:256)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:214)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:204)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2986)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2091)
我推测 Jackson 认为 MyClass 是一个列表所以不知道如何处理 {}
因为 []
是预期的
我通过使 MyClass
未实现 List<Integer>
来证实我的推测:
public class MyClass { /*same stuff*/}
一切正常。但是我需要 MyClass 来实现 List<Integer>
.....
我可以使用模块中的注释或配置来解决这个问题吗?
您或许可以编写一个自定义反序列化器,但我真的认为如果您删除 List 继承,问题会得到更好的解决。
实现该接口有什么要求?对于您的顶级 class 来说,拥有一个列表访问器而不是实现一个接口不是更有意义吗?从面向对象的角度来看,您的顶级 class 不是 "kind of" 列表。删除继承,您将拥有与 Jackson 一起使用的更简洁的设计。
我在阅读 this article 时偶然发现了我的答案, 基本上,我需要用
注释我的 class@JsonFormat(shape = Shape.OBJECT)