java – 杰克逊反序列化错误处理

前端之家收集整理的这篇文章主要介绍了java – 杰克逊反序列化错误处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题很简单:我有以下简单的类:
  1. public class Foo {
  2. private int id = -1;
  3. public void setId(int _id){ this.id = _id; }
  4. public int getId(){ return this.id; }
  5. }

我正在尝试处理以下JSON:

  1. {
  2. "id": "blah"
  3. }

显然,这里有一个问题(“blah”不能解析为int)

以前,杰克逊抛出像org.codehaus.jackson.map.JsonMappingException这样的东西:不能从String值’blah’构造java.lang.Integer的实例:不是有效的整数值

我同意这一点,但我想在某处允许忽略这种类型的映射错误.
我尝试使用一个DeserializationProblemHandler注册(见here),但它似乎只适用于未知属性而不是反序列化问题.

你有任何关于这个问题的线索吗?

解决方法

我成功地解决了我的问题,谢谢 Tatu from Jackson ML.

我不得不为Jackson中处理的每个原始类型使用自定义的非阻塞解串器.
像这样的工厂:

  1. public class JacksonNonBlockingObjectMapperFactory {
  2.  
  3. /**
  4. * Deserializer that won't block if value parsing doesn't match with target type
  5. * @param <T> Handled type
  6. */
  7. private static class NonBlockingDeserializer<T> extends JsonDeserializer<T> {
  8. private StdDeserializer<T> delegate;
  9.  
  10. public NonBlockingDeserializer(StdDeserializer<T> _delegate){
  11. this.delegate = _delegate;
  12. }
  13.  
  14. @Override
  15. public T deserialize(JsonParser jp,DeserializationContext ctxt) throws IOException,JsonProcessingException {
  16. try {
  17. return delegate.deserialize(jp,ctxt);
  18. }catch (JsonMappingException e){
  19. // If a JSON Mapping occurs,simply returning null instead of blocking things
  20. return null;
  21. }
  22. }
  23. }
  24.  
  25. private List<StdDeserializer> jsonDeserializers = new ArrayList<StdDeserializer>();
  26.  
  27. public ObjectMapper createObjectMapper(){
  28. ObjectMapper objectMapper = new ObjectMapper();
  29.  
  30. SimpleModule customJacksonModule = new SimpleModule("customJacksonModule",new Version(1,null));
  31. for(StdDeserializer jsonDeserializer : jsonDeserializers){
  32. // Wrapping given deserializers with NonBlockingDeserializer
  33. customJacksonModule.addDeserializer(jsonDeserializer.getValueClass(),new NonBlockingDeserializer(jsonDeserializer));
  34. }
  35.  
  36. objectMapper.registerModule(customJacksonModule);
  37. return objectMapper;
  38. }
  39.  
  40. public JacksonNonBlockingObjectMapperFactory setJsonDeserializers(List<StdDeserializer> _jsonDeserializers){
  41. this.jsonDeserializers = _jsonDeserializers;
  42. return this;
  43. }
  44. }

然后以这种方式调用它(作为解串器传递只有那些你想要阻止的):

  1. JacksonNonBlockingObjectMapperFactory factory = new JacksonNonBlockingObjectMapperFactory();
  2. factory.setJsonDeserializers(Arrays.asList(new StdDeserializer[]{
  3. // StdDeserializer,here,comes from Jackson (org.codehaus.jackson.map.deser.StdDeserializer)
  4. new StdDeserializer.ShortDeserializer(Short.class,null),new StdDeserializer.IntegerDeserializer(Integer.class,new StdDeserializer.CharacterDeserializer(Character.class,new StdDeserializer.LongDeserializer(Long.class,new StdDeserializer.FloatDeserializer(Float.class,new StdDeserializer.DoubleDeserializer(Double.class,new StdDeserializer.NumberDeserializer(),new StdDeserializer.BigDecimalDeserializer(),new StdDeserializer.BigIntegerDeserializer(),new StdDeserializer.CalendarDeserializer()
  5. }));
  6. ObjectMapper om = factory.createObjectMapper();

猜你在找的Java相关文章