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

Java 使用Jackson,如何获得任意pojo类的已知JSON属性列表?,java,json,jackson,Java,Json,Jackson,理想情况下,它看起来很像这样: List<String> props = objectMapper.getKnownProperties(MyPojo.class); List props=objectMapper.getKnownProperties(MyPojo.class); 唉,没有这样的方法。通常有效的方法是显式地将Include.ALWAYS设置为ObjectMapper的默认值,反射地实例化类的实例,将其转换为映射,并检查键集。但是,类仍然可以覆盖ObjectMap

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

List<String> props = objectMapper.getKnownProperties(MyPojo.class);
List props=objectMapper.getKnownProperties(MyPojo.class);
唉,没有这样的方法。通常有效的方法是显式地将Include.ALWAYS设置为ObjectMapper的默认值,反射地实例化类的实例,将其转换为映射,并检查键集。但是,类仍然可以覆盖ObjectMapper在给定注释下的include行为

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

编辑:

为了澄清这一点,这些POJO/javabeans/DTO是为与Jackson一起使用而设计的,并且已经装配了注释以产生特定的序列化行为。碰巧我需要动态地知道我可能会提前得到什么,理想情况下不需要复制jackson已有的信息。也就是说,如果另一个框架提供此功能,我很想知道。:)

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

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

也许您可以使用为类生成模式,然后检查模式。

根据您的具体需要,
JsonFilter
也可以工作(f.ex请参阅)

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

使用Jackson,您可以内省类并使用以下方法获取可用的JSON属性:

//为类构造Jackson JavaType
JavaType JavaType=mapper.getTypeFactory().constructType(MyDto.class);
//反思给定的类型
BeanDescription BeanDescription=mapper.getSerializationConfig().introspect(javaType);
//查找属性
List properties=beanDescription.findProperties();

如果您有类级注释,请检查此项。

您到底想做什么?也许有更好的工具,你试过Gson吗?然后,你不需要知道所有的属性就可以在json之间进行转换。具体地说,我正在开发一个小型rest api框架,它允许html客户端基于与JPA数据模型的单一属性相对应的任何json属性进行排序/搜索。为了正确地预先构造查询,我需要这些信息来确定有效的可能性。感谢面包屑。我不想忽略所有注释(
@JsonProperty
@JsonIgnore
的效果非常基本),但是忽略
@JsonInclude
可以确保所有潜在属性都被序列化。它看起来像是
AnnotationIntrospector。findSerializationInclusion()
是要覆盖的对象(或者可能是代理)。要抑制特定注释,可以将
JacksonAnnotationIntrospector
子类化,覆盖处理相关注释的方法。