简体   繁体   English

如何调用Jackson中自定义反序列化器中的默认反序列化器?

[英]How do I call the default deserializer in a custom deserializer in Jackson?

I have a JSON object that has 3 different objects in use. 我有一个JSON对象,有3个不同的对象在使用。

{ // Class A
"name" : "Name",
"list" : { 
    "names" : { //Class B
        "scale1" : { //Class C
            "max" : 10,
            "min" : 0
        },
        "scale2" : { //Class C
            "max" : 20,
            "min" : 15
        }
    }
} }

Class A contains a Map< String,Class B>, and Class B contains a Map< String,Class C>. A类包含Map <String,Class B>,B类包含Map <String,Class C>。 The issue I am having is that I have a custom deserializer for class B but I want to use the default deserializer for class C. 我遇到的问题是我有一个B类的自定义反序列化器,但我想使用C类的默认反序列化器。

I want to have it something like this: 我希望得到这样的东西:

public class BDeserializer extends JsonDeserializer<B> {
@Override
public B deserialize(JsonParser arg0, DeserializationContext arg1)
        throws IOException, JsonProcessingException {
    B bObject = new B();
    while(!arg0.isClosed()){            
        C cObject = CDeserializer.deserialize()
        bObject.names.add(cObject);     
    }
    return bObject;
} }

But I am not sure what arguments to pass into the CDeserializer, or if there is a away for me to call a default deserializer for class C. 但是我不确定传递给CDeserializer的参数是什么,或者我是否有机会为C类调用默认的反序列化器。

The classes look roughly like: 这些类看起来大致如下:

public class A {
String name;
Map<String,B> list = new HashMap<String,B>();

//getters & setters

}
public class B {
String name;
Map<String,C> fields = new HashMap<String,C>();

//getters & setters

}

public class C {
String name;
long min;
long max;

//getters & setters

}

You can use JsonParser object to read all properties. 您可以使用JsonParser对象来读取所有属性。 See below example: 见下面的例子:

class BJsonDeserializer extends JsonDeserializer<B> {

    @Override
    public B deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
        B result = new B();
        result.setFields(new HashMap<String, C>());

        while (parser.nextToken() != JsonToken.END_OBJECT) {
            String name = parser.getCurrentName();
            if ("scale1".equals(name) || "scale2".equals(name) || "anotherProperty".equals(name)) {
                parser.nextToken();
                result.getFields().put(name, parser.readValueAs(C.class));
            }
        }
        return result;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM