Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jackson在另一个反序列化器中嵌套了反序列化器调用_Java_Json_Serialization_Jackson - Fatal编程技术网

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
表示的反序列化程序的过程中(顺便说一句,extend
StdNodeBasedDeserializer
),那么您会遇到一个问题,即反序列化程序通常在流上工作,而不是在树节点上工作。现在,任何树节点都可以作为流进行遍历:因此可以使用
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);