【问题标题】:Using Jackson, how can a list of known JSON properties be obtained for any arbitrary pojo class?使用 Jackson,如何获取任意 pojo 类的已知 JSON 属性列表?
【发布时间】:2013-09-23 04:28:18
【问题描述】:

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

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

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

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

编辑:
澄清一下,这些 pojos/javabeans/DTO 是为与 Jackson 一起使用而设计的,并且已经配备了注释以产生特定的序列化行为。碰巧我需要动态地知道我可能会预先得到什么,最好不要复制杰克逊已经可用的信息。也就是说,如果另一个框架提供此功能,我很想知道。 :)

【问题讨论】:

  • 你到底想做什么?也许有更好的工具来完成这项工作。
  • 你试过Gson吗?那么你不需要知道所有的属性就可以在 json 之间进行转换。
  • 具体来说,我正在开发一个小型 rest api 框架,它允许 html 客户端根据与 JPA 数据模型的单个属性对应的任何 json 属性进行排序/搜索。为了预先正确构建查询,我需要这些信息来确定有效的可能性。

标签: java json jackson


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据您的具体需求,JsonFilter 也可以使用(f.ex 参见 http://www.cowtowncoder.com/blog/archives/2011/09/entry_461.html)。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的面包屑。我不想忽略所有注释(@JsonProperty@JsonIgnore 的效果非常基本),但忽略@JsonInclude 可确保所有潜在属性都被序列化。看起来 AnnotationIntrospector.findSerializationInclusion() 是要覆盖的东西(或者可能是代理)。
      • 要抑制特定的注解,可以继承JacksonAnnotationIntrospector,覆盖处理相关注解的方法。
      【解决方案4】:

      也许您可以使用Jackson's JSON Schema module 为类生成架构,然后检查架构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多