如何反序列化从JSON继承的POJO

时间:2019-07-10 09:10:39

标签: java json jackson deserialization

我正在尝试从JSON反序列化POJO对象(NoteObj)。 POJO对象扩展了我拥有自定义反序列化程序的Item(抽象对象)。此自定义反序列化器可确保如果需要IItem类作为POJO,则将返回特定的类(Edge或Vertex),而不是抽象类。

但是,当我想使用它返回NoteObj实例时。 但是,如果我用NoteObj.class调用解串器,则总是得到ArrayList<Vertex>,因为使用了NoteObj extends Item和我的自定义ItemDeserializer而不是某些默认的Jackson解串器。

IItem接口类:

@JsonDeserialize(
  using = ItemDeserializer.class
)
public interface IItem {
...
}

抽象类项

@JsonInclude(Include.NON_EMPTY)
@JsonDeserialize(
  using = ItemDeserializer.class
)
public abstract class Item implements IItem, Serializable {
...
}

我不需要使用ItemDeserializer的POJO对象,而是标准的Jackson序列化器,因此我可以使用NoteObj

public class NoteObj extends Item implements IItem {
...
}

ItemDeserialzier返回的另一个类(Edge相同):

@JsonDeserialize(using = JsonDeserializer.None.class)
public class Vertex extends Item implements IVertex, Serializable {
...
}

ItemDeserializer的代码为:

public class ItemDeserializer extends JsonDeserializer<IItem> {
 protected ItemDeserializer() {
 }

 public IItem deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
  TreeNode node = jsonParser.readValueAsTree();

   if (node.get("_from") != null) {
     return (Edge)jsonParser.getCodec().treeToValue(node, Edge.class);
   } else { 
     return (Vertex)jsonParser.getCodec().treeToValue(node, Vertex.class);
   }
 }
}

我已经尝试在NoteObj类定义中将@JsoNDeserialize与JsonNodeDeserializer.class一起使用,但这不会返回POJO,而是LinkedHashList。我尝试使用None.class,但这仍然用于ItemDeserializer。

我有个想法,我将修改ItemDeserializer以返回请求的POJO(例如,不仅是Edge,Vertex,而且是通用类,例如NoteObj)。但是我不知道如何确定要返回的泛型类。

0 个答案:

没有答案