47

我有一个用户类,我想使用 Jackson 映射到 JSON。

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,但我想知道是否可以通过配置来做到这一点?

4

8 回答 8

76

你有两个选择:

  1. 杰克逊致力于领域的二传手。因此,您可以删除要在 JSON 中省略的字段的 getter。(如果您在其他地方不需要吸气剂。)

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

    @JsonIgnore
    public int getSecurityCode(){
       return securityCode;
    }
    
于 2013-02-05T13:44:11.470 回答
22

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

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;
}
于 2017-05-24T20:46:58.823 回答
18

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

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

String applications;
于 2013-12-09T14:59:04.220 回答
6

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

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

Genson genson = new Genson.Builder().exclude("securityCode", User.class).create();
// and then
String json = genson.serialize(user);
于 2013-02-05T14:09:35.053 回答
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;
}
于 2019-06-21T15:49:57.913 回答
1

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

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

于 2017-02-24T17:40:59.933 回答
0

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

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

最后,@JsonProperty使用access属性就像一种魅力。

于 2019-06-21T15:23:50.613 回答
0

我建议你用这个。

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

这允许您设置 securityCode 的值(尤其是如果您使用 lombok @Setter)并且还可以防止该字段出现在 GET 请求中。

于 2022-02-10T08:13:09.143 回答