【问题标题】:Want to hide some fields of an object that are being mapped to JSON by Jackson想要隐藏由 Jackson 映射到 JSON 的对象的某些字段
【发布时间】:2013-01-20 10:19:36
【问题描述】:

我有一个要使用 Jackson 映射到 JSON 的 User 类。

public class User {
    private String name;
    private int age;
    prviate int securityCode;

    // getters and setters
}

我使用 - 将其映射到 JSON 字符串

User user = getUserFromDatabase();

ObjectMapper mapper = new ObjectMapper();   
String json =  mapper.writeValueAsString(user);

我不想映射securityCode 变量。有没有办法配置映射器以使其忽略此字段?

我知道我可以编写自定义数据映射器或使用 Streaming API,但我想知道是否可以通过配置来实现?

【问题讨论】:

标签: java json jackson


【解决方案1】:

我有一个类似的情况,我需要反序列化一些属性(JSON 到对象)但不序列化(对象到 JSON)

首先我选择了@JsonIgnore - 它确实阻止了不需要的属性的序列化,但也未能对其进行反序列化。尝试value 属性也无济于事,因为它需要一些条件。

最后,@JsonPropertyaccess 属性一起工作就像一个魅力。

【讨论】:

    【解决方案2】:

    字段级别:

    public class User {
        private String name;
        private int age;
        @JsonIgnore
        private int securityCode;
    
        // getters and setters
    }
    

    班级等级:

    @JsonIgnoreProperties(value = { "securityCode" })
    public class User {
        private String name;
        private int age;
        private int securityCode;
    }
    

    【讨论】:

      【解决方案3】:

      在此处添加此内容是因为其他人将来可能会再次搜索此内容,例如我。这个答案是Accepted Answer 的扩展

      You have two options:
      
      1. Jackson works on setters-getters of fields. So, you can just remove getter of field which you want to omit in JSON. ( If you don't need getter at other place.)
      
      2. Or, you can use the `@JsonIgnore` [annotation of Jackson][1] on getter method of that field and you see there in no such key-value pair in resulted JSON. 
      
              @JsonIgnore
              public int getSecurityCode(){
                 return securityCode;
              }
      

      实际上,较新版本的 Jackson 为 JsonProperty 添加了 READ_ONLY 和 WRITE_ONLY 注释参数。所以你也可以这样做。

      @JsonProperty(access = Access.WRITE_ONLY)
      private String securityCode;
      

      而不是

      @JsonIgnore
      public int getSecurityCode(){
        return securityCode;
      }
      

      【讨论】:

      • 这是一个很好的方法!即使@JsonIgnore 可能有效,但我觉得这很有用,而且非常直截了当。
      【解决方案4】:

      如果您使用 GSON,则必须将字段/成员声明标记为 @Expose 并使用 GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()

      不要忘记使用@Expose 标记您的子类,否则字段将不会显示。

      【讨论】:

        【解决方案5】:

        您还可以收集注释类的所有属性

        @JsonIgnoreProperties( { "applications" })
        public MyClass ...
        
        String applications;
        

        【讨论】:

        • 这对于带有 @Data lombok 注释的类来说是一个很好的选择,因为您对生成的 getter 和 setter 没有太多控制(只有访问级别)
        【解决方案6】:

        你有两个选择:

        1. Jackson 致力于字段的 setter-getter。因此,您可以删除要在 JSON 中省略的字段的 getter。 (如果您在其他地方不需要吸气剂。)

        2. 或者,您可以在该字段的 getter 方法上使用 @JsonIgnore annotation of Jackson,您会看到结果 JSON 中没有这样的键值对。

          @JsonIgnore
          public int getSecurityCode(){
             return securityCode;
          }
          

        【讨论】:

        • 我可以根据某些条件隐藏吗?说如果名称是管理员,那么我需要显示其他隐藏?
        • @foobar 你有没有为你的案例找到任何解决方法?我的情况和你一样
        • 我也在寻找基于某些条件隐藏特定属性的 Json 序列化。有人找到答案了吗?
        • 我觉得如果你使用 Lombok 你可以使用如下,@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
        【解决方案7】:

        如果您不想在 Pojo 上添加注释,也可以使用 Genson

        以下是如何在不使用任何注释的情况下排除包含字段的字段(如果需要,您也可以使用注释,但您可以选择)。

        Genson genson = new Genson.Builder().exclude("securityCode", User.class).create();
        // and then
        String json = genson.serialize(user);
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-12
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        相关资源
        最近更新 更多