杰克逊 - 定义自定义bean的方法是空的序列化

时间:2016-10-11 01:50:04

标签: java json jackson

杰克逊为序列化定义自定义bean的正确方法是什么?

我想通过Json-> POJO-> Json过滤不需要的字段。我想如果自定义bean对象中的所有变量都为null,则在序列化为JSON时不会出现自定义bean对象。如果内部的任何变量不为null,则应显示自定义bean对象。

目前,如果属于它的所有变量都为null,我有一个额外的方法来为自定义bean分配空值。我正在寻找的是杰克逊能否做到这一点。

public class JsonFileContext {

    //...Some variables

    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @JsonView(Views.In.class)
    private ContentRecognize contentRecognize;

    //...getter/setter method
}

ContentRecognize类

public class ContentRecognize {

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String type;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private RecognizePattern targetId;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private RecognizePattern msgId;

    //...getter/setter method
}

预期输出

{
    "var1":"var1Content",
    "var2":"var2Content"
}

{
    "var1":"var1Content",
    "var2":"var2Content",
    "contentRecognize":{
        "type":"typeContent"
    }
}

当前输出

{
    "var1":"var1Content",
    "var2":"var2Content",
    "contentRecognize":{}
}

{
    "var1":"var1Content",
    "var2":"var2Content",
    "contentRecognize":{
        "type":"typeContent"
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用@JsonIgnoreProperties@JsonIgnore注释之一。

<强> @JsonIgnoreProperties

用于忽略序列化和反序列化中的某些属性,无论其值如何:

  

防止指定字段被序列化或反序列化(即不包含在JSON输出中;或者即使包含它们也被设置):@JsonIgnoreProperties({ "internalId", "secretKey" })

     

忽略JSON输入中的任何未知属性,无异常:@JsonIgnoreProperties(ignoreUnknown=true)

<强> @JsonIgnore

  

标记注释,指示带注释的方法或字段   被基于内省的序列化和反序列化忽略   功能。也就是说,它不应该被视为“吸气剂”,“设定者”   或“创造者”。

     

此外,从Jackson 1.9开始,如果这是唯一的注释   与财产相关联,也会导致整体   要忽略的属性:即,如果setter具有此注释并且   getter没有注释,getter也被有效忽略。它是   仍然可以让不同的访问者使用不同的注释;   所以,如果只有“getter”被忽略,那么其他的访问者(setter或者   字段)需要明确的注释来防止忽视(通常   JsonProperty)。

在你的情况下,我会:

1:

@JsonIgnoreProperties({ "contentRecognize" })
public class JsonFileContext {
    [...]
}

2:

public class JsonFileContext {
    //...Some variables

    @JsonIgnore
    private ContentRecognize contentRecognize;

    //...getter/setter method
}

3:使用contentRecognize

注释@JsonIgnore getter