【问题标题】:JSON serialization of different attributes of a single entity for different requests using Jackson使用 Jackson 为不同请求对单个实体的不同属性进行 JSON 序列化
【发布时间】:2019-09-13 06:51:18
【问题描述】:

有几个 REST 调用需要具有不同属性集的相同 JSON 实体。实体示例:

public class JsonEntity
{
   public String id;
   public String name;
   public String type;
   public String model;
}

JsonEntity 是不同呼叫的复杂响应的一部分。第一次调用需要整个 JsonEntity 没有变化。第二次调用需要 JsonEntity 没有 typemodel 属性。第三个需要JsonEntity 没有name 属性。

是否有任何方法可以使用 Jackson 检索具有一组特定属性的相同 JSON 实体,具体取决于特定上下文(分隔 JsonEntity 除外)?

【问题讨论】:

    标签: java json serialization jackson json-serialization


    【解决方案1】:

    我看到了 3 种方法:

    1.使用@JsonGetter

    这个注释告诉杰克逊使用方法而不是字段进行序列化。 创建JsonEntity 的3 个子类,每个响应一个。更改JsonEntity 并在每个字段上使用@IgnoreField,如果可能,将它们设置为protected。在每个子类上,为您需要的字段创建特定的 getter,例如:

    public class JsonEntitySecondCall extends JsonEntity
    {
      @JsonGetter("id")
      public String getId(){
        return id;
      }
    
     @JsonGetter("name")
     public String getName(){
        return name;
      }
    }
    

    另外,为JsonEntity 创建一个克隆/复制构造函数。对于您的第二次调用,通过克隆原始 JsonEntity 创建一个新的 JsonEntitySecondCall,并在您的 API 中使用它。由于注释的原因,创建的对象只会序列化给定的字段。我不认为你可以只投射你的对象,因为杰克逊使用反射。

    2。使用@AnyGetter

    AnyGetter 注释允许您定义将被序列化的映射:

    private Map<String, Object> properties = new HashMap<>();
    
    @JsonAnyGetter
    public Map<String, Object> properties() {
        return properties;
    }
    

    现在您只需告诉您的JsonEntity 在每次调用之前它需要返回哪些属性(您可以创建 3 个方法,每个上下文一个,并使用一个枚举来设置必须使用哪个。)。

    3.使用@JsonInclude(Include.NON_NULL)

    这个注解告诉杰克逊不要序列化一个字段,如果它是空的。然后,您可以克隆您的对象并将您不想发送的字段设置为 null。 (这仅在您不应该向 API 发送 null 元素时才有效)

    有关 Jackson 注释的更多信息use this link

    【讨论】:

      猜你喜欢
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      相关资源
      最近更新 更多