我在使用 enableDefaultTyping 和提供泛型 TypeReference 时遇到了反序列化问题。杰克逊似乎无法决定哪种类型的信息更重要。这个测试用例证明了这个问题:
@Test
public void roundTripTest() throws JsonGenerationException,
JsonMappingException, IOException {
// 0 Value Test
Integer[] integers = new Integer[] {};
Wrap<Integer[]> beforeResult = new Wrap<Integer[]>(integers);
File file = new File("/tmp/jsonTest");
mapper.writeValue(file, beforeResult);
TypeReference<Wrap<Integer[]>> typeRef = new TypeReference<JacksonMapperTest.Wrap<Integer[]>>() {
};
Wrap<Integer[]> afterResult = mapper.readValue(file, typeRef);
assertNotNull(afterResult);
}
public static class Wrap<T> {
private T wrapped;
public Wrap() {
}
public Wrap(T wrapped) {
this.wrapped = wrapped;
}
public T getWrapped() {
return wrapped;
}
public void setWrapped(T wrapped) {
this.wrapped = wrapped;
}
}
其中映射器是:
mapper = new ObjectMapper();
mapper.enableDefaultTyping();
例外是:
org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class JacksonMapperTest$Wrap<[Ljava.lang.Integer;>]: can not instantiate from JSON object (need to add/enable type information?)
很奇怪,嗯?通过使用 beforeResult.getClass 而不是 TypeReference 可以省略该问题,但这仍然不是首选行为。
为了解决这个问题,我是否错过了任何一种选择?
我使用的是杰克逊 1.9.3
[编辑] 使用地图而不是数组作为包装对象按预期工作!