Reputation: 938
I use jackson for converting JSON to Object class.
JSON:
{
"aaa":"111",
"bbb":"222",
"ccc":"333"
}
Object Class:
class Test{
public String aaa;
public String bbb;
}
Code:
ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(content, valueType);
My code throws exception like that:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoResult), not marked as ignorable
And I don't want to add a prop to class Test,I just want jackson convert the exist value whith is also exist in Test.
Upvotes: 42
Views: 92775
Reputation: 714
As per this documentation, you can use the Jackson2ObjectMapperBuilder class to build your ObjectMapper. This Jackson2ObjectMapperBuilder is available in spring-web dependency jar.
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder
@Autowired
Jackson2ObjectMapperBuilder objectBuilder;
ObjectMapper mapper = objectBuilder.build();
String json = "{\"id\": 1001}";
By default, Jackson2ObjectMapperBuilder disables the error unrecognizedpropertyexception.
Upvotes: 1
Reputation: 3510
It is important to beforehand notice critical change of the model that can result breakdown of business logic.
To better control over application is better to handle this exception manually.
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;
}
});
Return true to handle UnrecognizedPropertyException
Do not ignore silently unrecognized fields.
Upvotes: 10
Reputation: 66993
Jackson provides a few different mechanisms to configure handling of "extra" JSON elements. Following is an example of configuring the ObjectMapper
to 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;
}
For other approaches, see http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown
Upvotes: 80
Reputation: 2258
If you are using Jackson 2.0 (fasterxml)
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Upvotes: 21
Reputation: 11871
As of Jackson 2.0 the inner enum (DeserializationConfig.Feature) has been moved to a standalone enum (DeserializationFeature):
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Upvotes: 41