使用Jackson,如何为任意pojo类获取已知JSON属性的列表?

理想情况下,它看起来很像这样:

List props = objectMapper.getKnownProperties(MyPojo.class); 

唉,没有这样的方法。 通常可行的方法是将Include.ALWAYS显式设置为ObjectMapper的默认值,reflection性地实例化该类的实例,将其转换为映射,并检查键集。 但是,类仍然可以覆盖给定注释的ObjectMapper的包含行为。

有更优雅的方法吗? 至少,有没有办法使用对象映射器覆盖类注释?

编辑:
只是为了澄清,这些pojos / javabeans / DTO设计用于与Jackson一起使用,并且已经使用注释进行操作以产生特定的序列化行为。 事实上,我需要动态地知道我可能会预先得到什么,最好不要重复jackson已有的信息。 也就是说,如果另一个框架提供此function,我很想知道。 🙂

使用Jackson,您可以使用以下内容对类进行内省并获取可用的JSON属性:

 // 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 properties = beanDescription.findProperties(); 

如果您有@JsonIgnoreProperties类级别注释,请检查此答案 。

根据您的确切需求, JsonFilter也可以工作(参见http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html )。

对于更高级的情况, BeanSerializerModifier确实允许您访问实际的BeanPropertyWriter列表,它们代表POJO具有的各个属性。 从那里,您可以编写一个动态启用/禁用输出的包装器。 或许你甚至可以组合方法:修改器来获取可能的属性名称列表; 然后FilterProvider动态添加filter。 这样做的好处是它是一种非常有效的实现过滤的方法。

可以通过使用虚拟AnnotationIntrospector忽略所有注释:

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

也许您可以使用Jackson的JSON Schema模块为类生成模式,然后检查模式。