想要隐藏杰克逊映射到JSON的对象的某些字段

时间:2013-02-05 13:13:15

标签: java json jackson

我有一个User类,我想使用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但我想知道是否可以通过配置来完成它?

8 个答案:

答案 0 :(得分:59)

您有两种选择:

  1. 杰克逊的工作场所是吸气者。因此,您可以删除要在JSON中省略的字段的getter。 (如果你不需要在其他地方使用吸气剂。)

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

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

答案 1 :(得分:12)

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

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

String applications;

答案 2 :(得分:10)

在此添加此内容,因为其他人可能会在将来再次搜索此内容,例如我。本答案是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;
}

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:1)

你可以使用@JsonIgnore注释 http://wiki.fasterxml.com/JacksonAnnotations

答案 5 :(得分:1)

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

请勿忘记使用@Expose标记子类,否则字段不会显示。

答案 6 :(得分:0)

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

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

最后,将@JsonPropertyaccess属性一起使用就像一种魅力。

答案 7 :(得分:0)

字段级别:

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;
}