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