Shaun
Shaun

Reputation: 2530

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

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. :)

Upvotes: 8

Views: 3253

Answers (4)

cassiomolin
cassiomolin

Reputation: 130917

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.

Upvotes: 7

StaxMan
StaxMan

Reputation: 116512

Depending on your exact needs, JsonFilter could also work (f.ex see http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html).

And for more advanced cases, BeanSerializerModifier does give you access to actual list of BeanPropertyWriters, which represent individual properties POJO has. From that, you could write a wrapper that enables/disables output dynamically. Or perhaps you can even combine approaches: modifier to get list of possible property names; then FilterProvider to dynamically add filter. Benefit of this would be that it is a very efficient way of implementing filtering.

Upvotes: 2

dnault
dnault

Reputation: 8899

Perhaps you could use Jackson's JSON Schema module to generate a schema for a class, then inspect the schema.

Upvotes: 1

dnault
dnault

Reputation: 8899

It's possible to ignore all annotations by using a dummy AnnotationIntrospector:

objectMapper.setAnnotationIntrospector(new AnnotationIntrospector(){
    @Override public Version version() {
        return Version.unknownVersion();
    }
});

Upvotes: 1

Related Questions