看起来非静态内部类的识别是在它们直接是其包含bean的属性的情况下完成的(
BeanDeserializerbase.java2.6.3中的476行)。因此,中间的Collection反序列化器将超越此范围。自定义解串器可能是这里最简单的选项。
请注意,您仍然可以使用杰克逊阅读的特性
Nested,只是实现它自己的结构,在自定义解串器 只 反序列化的列表时使用
Nested的对象。
为此,请像这样注释列表:
@JsonDeserialize(contentUsing = NestedDeserializer.class) public List<Nested> nestedList;
然后使用自定义解串器,它将:
在调用时查找解析上下文以查找包含的
MyClass
实例。封装默认的/根级别的反序列化器,
Nested
以委派将内容反序列化的工作。
例如:
public static final class NestedDeserializer extends StdDeserializer<MyClass.Nested> implements ResolvableDeserializer { private JsonDeserializer<Object> underlyingDeserializer; public NestedDeserializer() { super(MyClass.Nested.class); } @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { underlyingDeserializer = ctxt .findRootValueDeserializer(ctxt.getTypeFactory().constructType(MyClass.Nested.class)); } @Override public Nested deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { JsonStreamContext ourContext = p.getParsingContext(); JsonStreamContext listContext = ourContext.getParent(); JsonStreamContext containerContext = listContext.getParent(); MyClass container = (MyClass) containerContext.getCurrentValue(); MyClass.Nested value = container.new Nested(); // note use of three-argument deserialize method to specify instance to populate underlyingDeserializer.deserialize(p, ctxt, value); return value; }}


