我使用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转换存在的值,而测试中也存在这个值。
答案 0 :(得分:79)
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
答案 1 :(得分:40)
从Jackson 2.0开始,内部枚举(DeserializationConfig.Feature)已移至独立枚举(DeserializationFeature):
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
答案 2 :(得分:18)
如果您使用的是Jackson 2.0(fasterxml)
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
答案 3 :(得分: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;
}
});
返回 true 以处理 UnrecognizedPropertyException
不要忽略无声识别的无法识别的字段。