【问题标题】:jackson Unrecognized field杰克逊无法识别的字段
【发布时间】:2012-01-14 15:00:00
【问题描述】:

我使用 jackson 将 JSON 转换为 Object 类。

JSON:

{
    "aaa":"111",
    "bbb":"222", 
    "ccc":"333" 
}

对象类:

class Test{
    public String aaa;
    public String bbb;
}

代码:

ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(content, valueType);

我的代码抛出这样的异常:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoResult), not marked as ignorable

而且我不想在 Test 类中添加道具,我只想让 jackson 将存在的值转换为 Test 中也存在的值。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    根据documentation,您可以使用 Jackson2ObjectMapperBuilder 类来构建您的 ObjectMapper。这个 Jackson2ObjectMapperBuilder 在 spring-web 依赖 jar 中可用。

    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder
    
    @Autowired
    Jackson2ObjectMapperBuilder objectBuilder;
    
    ObjectMapper mapper = objectBuilder.build();
    String json = "{\"id\": 1001}";
    

    默认情况下,Jackson2ObjectMapperBuilder 禁用错误 unrecognizedpropertyexception。

    【讨论】:

      【解决方案2】:

      重要的是提前注意模型的关键变化,这可能导致业务逻辑崩溃。

      为了更好地控制应用程序,最好手动处理此异常。

      objectMapper.addHandler(new DeserializationProblemHandler() {
      
                  @Override
                  public boolean handleUnknownProperty(DeserializationContext ctxt,
                          JsonParser jp, JsonDeserializer<?> deserializer,
                          Object beanOrClass, String propertyName)
                          throws IOException, JsonProcessingException {
      
                      String unknownField = String.format("Ignoring unknown property %s while deserializing %s", propertyName, beanOrClass);
                      Log.e(getClass().getSimpleName(), unknownField);
                      return true;
                  }
              });
      

      返回true来处理UnrecognizedPropertyException

      不要忽略无法识别的字段。

      【讨论】:

      • 我认为只说“不要”太宽泛了。当谈到 api 和灵活地更改版本时,我是 Postel 定律的粉丝。 en.wikipedia.org/wiki/Robustness_principle
      • 聚会迟到了,但这是一个很好的答案。 @MattBroekhuis 这个答案与 Postel 定律不冲突,而且很灵活。它的作用是让某人在某个地方有机会弄清楚为什么 API 没有按预期处理某些事情,而不是简单地掩盖有用的信息。
      【解决方案3】:

      Jackson 提供了几种不同的机制来配置“额外”JSON 元素的处理。以下是将ObjectMapper 配置为非FAIL_ON_UNKNOWN_PROPERTIES 的示例。

      import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
      import org.codehaus.jackson.annotate.JsonMethod;
      import org.codehaus.jackson.map.DeserializationConfig;
      import org.codehaus.jackson.map.ObjectMapper;
      
      public class JacksonFoo
      {
        public static void main(String[] args) throws Exception
        {
          // { "aaa":"111", "bbb":"222", "ccc":"333" }
          String jsonInput = "{ \"aaa\":\"111\",
                                \"bbb\":\"222\",
                                \"ccc\":\"333\" }";
      
          ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD,
                               Visibility.ANY);
          mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                           false);
      
          Test test = mapper.readValue(jsonInput, Test.class);
        }
      }
      
      class Test
      {
        String aaa;
        String bbb;
      }
      

      其他方法见http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

      【讨论】:

      【解决方案4】:

      如果您使用的是 Jackson 2.0 (fasterxml)

      ObjectMapper mapper = new ObjectMapper();
      mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
      

      【讨论】:

        【解决方案5】:

        从 Jackson 2.0 开始,内部枚举 (DeserializationConfig.Feature) 已移至独立枚举 (DeserializationFeature):

        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-28
          • 1970-01-01
          • 1970-01-01
          • 2011-05-28
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          相关资源
          最近更新 更多