Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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_Jackson - Fatal编程技术网

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

Java 如何调用Jackson中自定义反序列化程序中的默认反序列化程序?,java,json,jackson,Java,Json,Jackson,我有一个JSON对象,它使用了3个不同的对象 { // Class A "name" : "Name", "list" : { "names" : { //Class B "scale1" : { //Class C "max" : 10, "min" : 0 }, "scale2" : { //Class C "max" : 20, "min

我有一个JSON对象,它使用了3个不同的对象

{ // Class A
"name" : "Name",
"list" : { 
    "names" : { //Class B
        "scale1" : { //Class C
            "max" : 10,
            "min" : 0
        },
        "scale2" : { //Class C
            "max" : 20,
            "min" : 15
        }
    }
} }
类A包含映射<字符串,类B>,类B包含映射<字符串,类C>。我遇到的问题是,我有一个用于类B的自定义反序列化程序,但我想使用用于类C的默认反序列化程序

我想要这样的东西:

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;
} }
公共类序列化程序扩展JsonDeserializer{
@凌驾
公共B反序列化(JsonParser arg0,反序列化上下文arg1)
抛出IOException、JsonProcessingException{
B对象=新的B();
而(!arg0.isClosed()){
C cObject=CDeserializer.deserialize()
bObject.names.add(cObject);
}
返回对象;
} }
但我不确定应该将哪些参数传递到CDeserializer,或者是否有一个方法可以让我调用C类的默认反序列化程序

这些类大致如下所示:

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

}
公共A类{
字符串名;
映射列表=新的HashMap();
//接球手和接球手
}
公共B级{
字符串名;
映射字段=新的HashMap();
//接球手和接球手
}
公共C类{
字符串名;
龙敏;
长最大值;
//接球手和接球手
}

您可以使用
JsonParser
对象读取所有属性。请参见以下示例:

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;
    }
}
类BJsonDeserializer扩展JsonDeserializer{
@凌驾
公共B反序列化(JsonParser解析器,反序列化上下文)抛出IOException,JsonProcessingException{
B结果=新的B();
result.setFields(新的HashMap());
while(parser.nextToken()!=JsonToken.END\u对象){
String name=parser.getCurrentName();
如果(“scale1.equals(name)| |“scale2.equals(name)| |“anotherProperty.equals(name)){
parser.nextToken();
result.getFields().put(name,parser.readValueAs(C.class));
}
}
返回结果;
}
}

您是否可以为上述JSON显示您的POJO类?这并不是真正回答问题,是吗?因为您没有显示如何调用标准反序列化程序。'parser.readValueAs(C.class)'-调用标准反序列化程序。您必须将解析器移动到正确的位置,并使用您期望的类调用“readValueAs”方法。是的,当您知道期望的类在那里时,这就起作用了。但是如果你想建造更多的东西呢generic@RaduSimionescu,您必须指定“generic”是什么意思?好吧,您知道B是谁,并且在反序列化时手动填充其字段。只要给定所需输出实例的类,通用反序列化程序就能够反序列化任何内容。你可能已经为一门课制定了解决方案,但你没有回答这个问题。如何调用默认的反序列化程序。。。如果这些领域很复杂,就需要这些