使用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模块为类生成模式,然后检查模式。
- jackson将数组反序列化为java对象
- 在Jackson ObjectMapper上配置缩进间距的最简单方法是什么?
- Spring 3.2和Jackson 2:添加自定义对象映射器
- 使用jackson将json反序列化为java – 特殊字符问题
- Jackson ObjectMapper无法反序列化POJO,抛出exception:没有为类型找到合适的构造函数:无法从JSON对象实例化
- Spring @JsonIgnore无法正常工作
- 我们可以在使用JSON时将对象设置为地图中的键吗?
- RestEASY和Jackson不兼容 – NoSuchMethodException
- 如何反映jackson在几秒钟内的时间戳?