Jackson反序列化错误处理

我的问题很简单:我有以下简单的类:

public class Foo {

private int id = -1;

public void setId(int _id){ this.id = _id; }

public int getId(){ return this.id; }

}

我正在尝试处理以下JSON:

{

"id": "blah"

}

显然,这里存在一个问题(“ blah”无法解析为int)

以前,Jackson抛出类似org.codehaus.jackson.map.JsonMappingException的内容:无法从字符串值’blah’构造java.lang.Integer的实例:不是有效的Integer值

我同意这一点,但是我想在某个地方注册一些东西,以忽略这种类型的映射错误。我尝试用注册的DeserializationProblemHandler进行尝试(请参阅此处),但它似乎仅适用于未知属性,而不适用于反序列化问题。

您对此问题有任何线索吗?

回答:

感谢Jackson

Jackson的Tatu,我成功解决了我的问题。

对于在Jackson中处理的每个原始类型,我必须使用自定义非阻塞解串器。像这样的工厂:

public class JacksonNonBlockingObjectMapperFactory {

/**

* Deserializer that won't block if value parsing doesn't match with target type

* @param <T> Handled type

*/

private static class NonBlockingDeserializer<T> extends JsonDeserializer<T> {

private StdDeserializer<T> delegate;

public NonBlockingDeserializer(StdDeserializer<T> _delegate){

this.delegate = _delegate;

}

@Override

public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {

try {

return delegate.deserialize(jp, ctxt);

}catch (JsonMappingException e){

// If a JSON Mapping occurs, simply returning null instead of blocking things

return null;

}

}

}

private List<StdDeserializer> jsonDeserializers = new ArrayList<StdDeserializer>();

public ObjectMapper createObjectMapper(){

ObjectMapper objectMapper = new ObjectMapper();

SimpleModule customJacksonModule = new SimpleModule("customJacksonModule", new Version(1, 0, 0, null));

for(StdDeserializer jsonDeserializer : jsonDeserializers){

// Wrapping given deserializers with NonBlockingDeserializer

customJacksonModule.addDeserializer(jsonDeserializer.getValueClass(), new NonBlockingDeserializer(jsonDeserializer));

}

objectMapper.registerModule(customJacksonModule);

return objectMapper;

}

public JacksonNonBlockingObjectMapperFactory setJsonDeserializers(List<StdDeserializer> _jsonDeserializers){

this.jsonDeserializers = _jsonDeserializers;

return this;

}

}

然后以这种方式调用它(仅将要成为非阻塞对象的那些作为反序列化器传递):

JacksonNonBlockingObjectMapperFactory factory = new JacksonNonBlockingObjectMapperFactory();

factory.setJsonDeserializers(Arrays.asList(new StdDeserializer[]{

// StdDeserializer, here, comes from Jackson (org.codehaus.jackson.map.deser.StdDeserializer)

new StdDeserializer.ShortDeserializer(Short.class, null),

new StdDeserializer.IntegerDeserializer(Integer.class, null),

new StdDeserializer.CharacterDeserializer(Character.class, null),

new StdDeserializer.LongDeserializer(Long.class, null),

new StdDeserializer.FloatDeserializer(Float.class, null),

new StdDeserializer.DoubleDeserializer(Double.class, null),

new StdDeserializer.NumberDeserializer(),

new StdDeserializer.BigDecimalDeserializer(),

new StdDeserializer.BigIntegerDeserializer(),

new StdDeserializer.CalendarDeserializer()

}));

ObjectMapper om = factory.createObjectMapper();

以上是 Jackson反序列化错误处理 的全部内容, 来源链接: utcz.com/qa/421297.html

回到顶部