Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Jackson, how can a list of known JSON properties be obtained for any arbitrary pojo class?

Tags:

java

json

jackson

Ideally, it would look much like this:

List<String> props = objectMapper.getKnownProperties(MyPojo.class);

Alas, there is no such method. An approach that would generally work is to explicitly set Include.ALWAYS as the ObjectMapper's default, instantiate an instance of the class reflectively, convert it to a map, and examine the keyset. However, classes can still override the ObjectMapper's include behavior given annotations.

Is there a more elegant approach? At the very least, is there a way to override class annotations using the object mapper?

Edit:
Just to clarify, these pojos/javabeans/DTOs are designed for use with Jackson and are already rigged with annotations to result in specific serialization behavior. It just so happens that I need to dynamically know what I might end up with up-front, ideally without duplicating the information already available to jackson. That said, if another framework offers this functionality, I'd be curious to know. :)

like image 863
Shaun Avatar asked Sep 23 '13 04:09

Shaun


People also ask

How did Jackson deal with unknown properties?

Jackson API provides two ways to ignore unknown fields, first at the class level using @JsonIgnoreProperties annotation and second at the ObjectMapper level using configure() method.

How does Jackson understand which variables to Map a JSON key?

When Jackson maps JSON to POJOs, it inspects the setter methods. Jackson by default maps a key for the JSON field with the setter method name. For Example, Jackson will map the name JSON field with the setName() setter method in a POJO.


1 Answers

With Jackson, you can introspect a class and get the available JSON properties using:

// Construct a Jackson JavaType for your class
JavaType javaType = mapper.getTypeFactory().constructType(MyDto.class);

// Introspect the given type
BeanDescription beanDescription = mapper.getSerializationConfig().introspect(javaType);

// Find properties
List<BeanPropertyDefinition> properties = beanDescription.findProperties();

If you have @JsonIgnoreProperties class level annotations, check this answer.

like image 148
cassiomolin Avatar answered Sep 22 '22 05:09

cassiomolin