Java 杰克逊未识别字段

Java 杰克逊未识别字段,java,json,jackson,Java,Json,Jackson,我使用jackson将JSON转换为对象类 JSON: 对象类: class Test{ public String aaa; public String bbb; } 代码: 我的代码引发如下异常: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoRe

我使用jackson将JSON转换为对象类

JSON:

对象类:

class Test{
    public String aaa;
    public String bbb;
}
代码:

我的代码引发如下异常:

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

我不想在类测试中添加一个道具,我只想jackson将exist值转换为在测试中也存在的值。

jackson提供了一些不同的机制来配置对“额外”JSON元素的处理。下面是一个将
ObjectMapper
配置为不
FAIL\u ON\u UNKNOWN\u属性的示例

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
导入org.codehaus.jackson.annotate.JsonMethod;
导入org.codehaus.jackson.map.DeserializationConfig;
导入org.codehaus.jackson.map.ObjectMapper;
公务舱杰克逊福
{
公共静态void main(字符串[]args)引发异常
{
//{“aaa”:“111”、“bbb”:“222”、“ccc”:“333”}
字符串jsonInput=“{\“aaa\”:\“111\”,
\“bbb\”:“222\”,
\“ccc\”:\“333\”};
ObjectMapper mapper=new ObjectMapper().setVisibility(JsonMethod.FIELD,
能见度(如有);
mapper.configure(在未知属性上反序列化config.Feature.FAIL),
假);
Test=mapper.readValue(jsonInput,Test.class);
}
}
课堂测试
{
串aaa;
串bbb;
}

有关其他方法,请参见自Jackson 2.0起,内部枚举(反序列化配置.Feature)已移动到独立枚举(反序列化功能):


mapper.configure(在未知属性上反序列化feature.FAIL,false)

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


提前注意可能导致业务逻辑崩溃的模型的关键更改非常重要

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

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;
            }
        });
objectMapper.addHandler(新的反序列化ProblemHandler(){
@凌驾
公共布尔handleUnknownProperty(反序列化上下文ctxt,
JsonParser jp,JsonDeserializer反序列化程序,
对象beanOrClass,字符串propertyName)
抛出IOException、JsonProcessingException{
String unknownField=String.format(“在反序列化%s时忽略未知属性%s”,propertyName,beanOrClass);
Log.e(getClass().getSimpleName(),未知字段);
返回true;
}
});
返回true以处理未识别的PropertyException


不要忽略未识别的字段。

注意,对于2.x,您将使用它。我认为它太宽泛了,不能只说“不要”。当谈到api和灵活地更改版本时,我是Postel定律的粉丝。晚会迟到了,但这是个好答案@马特布罗克胡伊斯这个答案与波斯特尔定律没有冲突,而且是灵活的。它所做的是给某人,某处,一个机会去弄清楚为什么API并没有按预期处理某些事情,而不是简单地掩盖有用的信息。
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoResult), not marked as ignorable
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
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;
            }
        });