【问题标题】:Json Ignore property only in specific methodJson 仅在特定方法中忽略属性
【发布时间】:2015-11-17 19:01:18
【问题描述】:

我有一个类所以如下图:

@Entity
@Table(name = "so", schema = "public")
public class So implements java.io.Serializable , IBusiness {

    private int idSo;

    private Set<PartOrder> partOrders = new HashSet<PartOrder>();

    public So() {

    }

    @Id
    @SequenceGenerator(name = "seqGenerator", sequenceName = "so_seq", allocationSize=1, initialValue=1)
    @GeneratedValue(generator="seqGenerator", strategy=GenerationType.SEQUENCE)
    @Column(name = "id_so", unique = true, nullable = false)
    public int getIdSo() {
        return this.idSo;
    }

    public void setIdSo(int idSo) {
        this.idSo = idSo;
    }

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "so")
    public Set<PartOrder> getPartOrders() {
        return this.partOrders;
    }

    public void setPartOrders(Set<PartOrder> partOrders) {
        this.partOrders = partOrders;
    }


}

我有一个返回带有 SO 的 Json 的方法。但我不希望将 partOrders 属性包含在响应 json 中。我在属性上使用了@JsonIgnore,但现在,我有另一个接收 SO 对象的方法,我需要获取 partOders。

问题是:有没有办法指定何时忽略该属性(在特定方法中)?

提前致谢!

【问题讨论】:

    标签: java json annotations jackson


    【解决方案1】:

    您可以通过使用带有 FilterProvider 的 Json 过滤器来实现此目的

    1. 您使用@JsonFilter 注释将过滤器名称分配给您的 POJO。
    2. 在序列化之前,将SimpleBeanPropertyFilter 的实例附加到过滤器名称。该类有两个工厂方法,用于基于属性名称工作的过滤器。

    以下是注解声明的示例:

    @JsonFilter("filter properties by name")
    public class So {
        public String alwaysWrite = "alwaysWriteValue";
        public String somtimeIgnore = "somtimeIgnoreValue";
    }
    

    这是一个分配过滤器的方法,该过滤器将忽略somtimeIgnore 属性

    public void dontWriteSomtimes(So so) {
        ObjectMapper mapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider()  
          .addFilter("filter properties by name", SimpleBeanPropertyFilter.serializeAllExcept("somtimeIgnore"));  
        ObjectWriter writer = mapper.writer(filters);  
        try {
            System.out.println(writer.writeValueAsString(so));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    输出:
    {"alwaysWrite":"alwaysWriteValue"}

    这是一个可以编写所有内容的方法:只需分配一个不存在或为空的属性:

    public void writeEveryting(So so) {
        ObjectMapper mapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider()  
          .addFilter("filter properties by name", SimpleBeanPropertyFilter.serializeAllExcept(""));  
        ObjectWriter writer = mapper.writer(filters);  
        try {
            System.out.println(writer.writeValueAsString(so));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    输出:
    {"alwaysWrite":"alwaysWriteValue","somtimeIgnore":"somtimeIgnoreValue"}

    【讨论】:

      【解决方案2】:

      您为您的班级添加了 jSON 忽略注释。我认为它会克服你的要求。您可以在此处留下不需要的属性。

      @JsonIgnoreProperties(ignoreUnknown = true)
      class ClassName{
      
      }
      

      【讨论】:

      • kumaresan 感谢您的回复。不幸的是,将@JsonIgnoreProperties 放入不是解决方案,因为这两种方法都在同一个类上。正如我之前提到的,我希望在方法上考虑属性和忽略它的另一种方法。感谢您的回复
      • 你把第二个方法的值设为null,然后当你需要的时候,再做一次。请。
      • 是的,null 工作正常。我不知道这是否是最优雅的解决方案,但它可以解决火灾。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2011-04-06
      • 2016-12-15
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多