【问题标题】:How to add @JsonIgnore annotated fields in serializing in Jackson ObectMapper如何在 Jackson ObjectMapper 的序列化中添加 @JsonIgnore 注释字段
【发布时间】:2016-06-10 20:57:56
【问题描述】:

我需要在通过Jackson ObjectMapper 序列化对象时添加@JsonIgnore 注释字段。我知道您可能会提议我从我的课程中删除 @JsonIgnore 注释,但我需要它们在我的应用程序的某些部分中是可忽略的。在我的应用程序的另一部分,我需要在我的json 字符串中包含那些@JsonIgnore 注释字段。

【问题讨论】:

  • 也许考虑使用 Jackson 模块?

标签: java json serialization jackson


【解决方案1】:

您可以定义 SimpleBeanPropertyFilter 和 FilterProvider。

首先用这样的自定义过滤器注释你的类:

@JsonFilter("firstFilter")
public class MyDtoWithFilter {

    private String name;

    private String anotherName;
    private SecondDtoWithFilter dtoWith;

    // get set ....
}
 @JsonFilter("secondFilter")
public class SecondDtoWithFilter{
    private long id;
    private String secondName;
}

这就是动态序列化对象的方式。

    ObjectMapper mapper = new ObjectMapper();

    // Field that not to be serialised. 
    SimpleBeanPropertyFilter firstFilter = SimpleBeanPropertyFilter.serializeAllExcept("anotherName");
     SimpleBeanPropertyFilter secondFilter = SimpleBeanPropertyFilter.serializeAllExcept("secondName");

    FilterProvider filters = new SimpleFilterProvider().addFilter("firstFilter", firstFilter).addFilter("secondFilter", secondFilter);

    MyDtoWithFilter dtoObject = new MyDtoWithFilter();
    String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject);

【讨论】:

  • 感谢您的回答。如何在 serializeAllExcept 中添加子字段?我的意思是我有一个类,这个类的一个属性是另一个类。而且这个类也有一些应该序列化或不序列化的字段
  • 那么在这种情况下,您必须将完整路径添加到您的属性。为此更新上面的答案代码。快乐编码! :)
  • 不幸的是,它不起作用。我仍然可以在我的 json 字符串中看到 innerProperty2。但属性 1 并没有像预期的那样在 json 中。
  • @gabby 请编辑我的答案以及嵌套属性的工作代码。它会帮助别人。谢谢
【解决方案2】:

我建议在您的特定映射发生时通过反射以编程方式删除和重新添加它们。

【讨论】:

    【解决方案3】:

    这表明你有两种不同的模型,它们有一些共同的元素。我会重新检查你的模型。

    【讨论】:

      【解决方案4】:
      public class MainProgram {
          @JsonFilter("nameRemoveFilter")
          public static class User{
      
              private String name;
      
              private String age;
      
              private String password;
      
              public String getName() {
                  return name;
              }
      
              public void setName(String name) {
                  this.name = name;
              }
      
              public String getAge() {
                  return age;
              }
      
              public void setAge(String age) {
                  this.age = age;
              }
      
              public String getPassword() {
                  return password;
              }
      
              public void setPassword(String password) {
                  this.password = password;
              }
      
      
      
          }
      
          public static void main(String[] args) {
              ObjectMapper mapper = new ObjectMapper();
              FilterProvider filters = new SimpleFilterProvider().addFilter("nameRemoveFilter",
                      SimpleBeanPropertyFilter.filterOutAllExcept("name","age"));
                  // and then serialize using that filter provider:
                  User user = new User();
                  try {
                      String json = mapper.writer(filters).writeValueAsString(user);
                      System.out.println(json);
                  } catch (JsonProcessingException e) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
                  }
          }
      
      
          Works for Latest version of Jackson after 2.0
      

      【讨论】:

        猜你喜欢
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2012-03-07
        相关资源
        最近更新 更多