Jaxb 反序列化可以是对象或布尔值的数据

Jaxb 反序列化可以是对象或布尔值的数据,jaxb,jackson,Jaxb,Jackson,我使用的maven和jersey具有以下依赖项 <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>2.25</version> </dependency> <dep

我使用的maven和jersey具有以下依赖项

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.25</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25</version>
    </dependency>
    <dependency>
        <groupId>org.jvnet.jaxb2_commons</groupId>
        <artifactId>jaxb2-basics-annotate</artifactId>
        <version>1.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.jvnet.jaxb2_commons</groupId>
        <artifactId>jaxb2-basics</artifactId>
        <version>0.9.1</version>
    </dependency>
从xsd生成类的插件

我正在尝试反序列化json,它可以通过两种方式接收:

{
    "config": {
         "field1": 1,
         "field2": 2,
         "object1": {
              .
              .
         }
    }
}

对于后者,我希望如此

{
    "config": {}
}
但事实并非如此,我对此也没有影响力

当我反序列化它时,我得到一个异常

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.my.model.ConfigMap out of VALUE_FALSE token
我很清楚为什么会有这个例外

我一直试图使用自定义反序列化程序来解决这个问题,但没有成功

public class ConfigTypeDeserializer extends JsonDeserializer<ConfigType> {
    @Override
    public ConfigType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ObjectCodec cd = jsonParser.getCodec();
        JsonNode node = cd.readTree(jsonParser);

        ConfigType object = new ObjectFactory().createConfigType();
        if (node.isBoolean()) {
            return object;
        }

        // now I know its not a weird response so now I want to deserialize as usual

        return object;
    }
但这确实会生成ConfigType对象,但内容不正确。我没有得到预期的对象类型

因此,我想知道是否可以使用(或继续)来自自定义反序列化程序的现有反序列化代码


如果这是不可能的,还有其他方法吗?

我发现了一个非常整洁的库

对于maven:

<dependency>
    <groupId>com.github.jonpeterson</groupId>
    <artifactId>jackson-module-json-interceptor</artifactId>
    <version>1.0.0</version>
</dependency>
在我的拦截器类中,我可以做到这一点

public class MyDeserializationInterceptor implements JsonInterceptor {
    @Override
    public JsonNode intercept(JsonNode node, JsonNodeFactory nodeFactory) {
        JsonNode config = node.findValue("config");

        // convert boolean to object
        if (node.isObject() && config.isBoolean()) {
            ObjectNode objectNode = nodeFactory.objectNode();
            ((ObjectNode)node).set("config",objectNode);
        }

        return node;
    }
}
反序列化过程愉快地继续着:)

谢谢乔恩·彼得森

cd.readValue(jsonParser,ConfigType.class);
<dependency>
    <groupId>com.github.jonpeterson</groupId>
    <artifactId>jackson-module-json-interceptor</artifactId>
    <version>1.0.0</version>
</dependency>
@JsonInterceptors(beforeDeserialization = {
    MyDeserializationInterceptor.class
})
public class MyProblematicObject {
..
}
public class MyDeserializationInterceptor implements JsonInterceptor {
    @Override
    public JsonNode intercept(JsonNode node, JsonNodeFactory nodeFactory) {
        JsonNode config = node.findValue("config");

        // convert boolean to object
        if (node.isObject() && config.isBoolean()) {
            ObjectNode objectNode = nodeFactory.objectNode();
            ((ObjectNode)node).set("config",objectNode);
        }

        return node;
    }
}