杰克逊无法识别的领域

YET*_*ETI 39 java json jackson

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

JSON:

{
    "aaa":"111",
    "bbb":"222", 
    "ccc":"333" 
}
Run Code Online (Sandbox Code Playgroud)

对象类:

class Test{
    public String aaa;
    public String bbb;
}
Run Code Online (Sandbox Code Playgroud)

码:

ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(content, valueType);
Run Code Online (Sandbox Code Playgroud)

我的代码抛出异常:

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

而且我不想为类Test添加一个道具,我只想让jackson转换存在的值,而测试中也存在.

Pro*_*uce 80

Jackson提供了一些不同的机制来配置"额外"JSON元素的处理.以下是配置ObjectMapperto not 的示例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;
}
Run Code Online (Sandbox Code Playgroud)

有关其他方法,请参阅http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

  • 请注意,对于2.x,您将使用[`mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);`](http://wiki.fasterxml.com/JacksonFeaturesDeserialization). (24认同)

Owe*_*ing 40

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

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);


Aal*_*iry 18

如果你使用的是Jackson 2.0(更快的xml)

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Run Code Online (Sandbox Code Playgroud)


Fli*_*bor 8

重要的是事先注意到可能导致业务逻辑崩溃的模型的关键变化.

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

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;
            }
        });
Run Code Online (Sandbox Code Playgroud)

返回true以处理UnrecognizedPropertyException

不要忽略静默无法识别的字段.