Java jackson在另一个反序列化器中嵌套了反序列化器调用
我上过这样的课:Java jackson在另一个反序列化器中嵌套了反序列化器调用,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我上过这样的课: class A { private String z; private String y; private List<B> bs; } class B { private String x; } 因此,BSerializer.serialize()在调用gen.writeObject(b)时会自动调用ASerializer.serialize() 我正试图对序列化对象执行同样的操作。 因此,我有两个序列化程序,一个用于A,另一个用
class A {
private String z;
private String y;
private List<B> bs;
}
class B {
private String x;
}
因此,BSerializer.serialize()
在调用gen.writeObject(b)
时会自动调用ASerializer.serialize()
我正试图对序列化对象执行同样的操作。
因此,我有两个序列化程序,一个用于A,另一个用于B。问题是我不知道如何在ADeserializer
内部将Jackson调用自动设置为bdeseserializer
公共类ADeserializer扩展JsonDeserializer
{
@覆盖
公共反序列化(JsonParser p,DeserializationContext ctxt)抛出IOException,JsonProcessingException{
A=零;
JsonNode node=p.getCodec().readTree(p);
字符串z=node.get(“z”).asText();
字符串y=node.get(“y”).asText();
List bs=node.get(“bs”)/.asListofB
//...
问题是,我怎样才能从另一个呼叫Desiarizer
注意:
A
和B
是第三方类。因此我无法对它们进行注释。即使不能直接对这些类进行注释,也可以编写“mixin”注释类。这些类的存在只是为了保存注释,然后将其应用于其他类上。例如:
public abstract class AMixin {
@JsonProperty public abstract String getZ();
@JsonProperty public abstract String getY();
@JsonProperty public abstract List<B> getBs();
}
如果您在编写基于JsonNode
表示的反序列化程序的过程中(顺便说一句,extendStdNodeBasedDeserializer
),那么您会遇到一个问题,即反序列化程序通常在流上工作,而不是在树节点上工作。现在,任何树节点都可以作为流进行遍历:因此可以使用node.get(“bs”)
,调用traverse()
,从而获得一个JsonParser
,您可以将其传递给反序列化程序。当然,如果反序列化程序最终将流转换回树节点,这是一种浪费
最后我确实创建了一些东西来封装它(如果下一个反序列化程序本身是StdNodeBasedDeserializer
,那么就采取一种捷径,并避免遍历),但我现在手头没有它。IMHO生成mixin类来让Jackson构建序列化程序/反序列化程序(保持同步!)是一种更好的方法
@Override
public A deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
A a = null;
JsonNode node = p.getCodec().readTree(p);
String z = node.get("z").asText();
String y = node.get("y").asText();
List<B> bs = node.get("bs") //.asListofB
//...
public abstract class AMixin {
@JsonProperty public abstract String getZ();
@JsonProperty public abstract String getY();
@JsonProperty public abstract List<B> getBs();
}
mapper.addMixInAnnotations(A.class, AMixin.class);