YETI
YETI

Reputation: 938

jackson Unrecognized field

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

Answers (5)

Praj
Praj

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

Alexander B
Alexander B

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

Programmer Bruce
Programmer Bruce

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

Abdulrhman Alkhodiry
Abdulrhman Alkhodiry

Reputation: 2258

If you are using Jackson 2.0 (fasterxml)

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

Upvotes: 21

Owen Pauling
Owen Pauling

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

Related Questions