使用 jackson 将对象转换为 json 时忽略未设置原始类型

tuk*_*tuk 3 java json jackson

我有一个如下所示的课程:-

@JsonSerialize(include = Inclusion.NON_EMPTY)
public class JsonPojo {
    private int intVal;
    private String strVal;

    public int getIntVal() {
    return intVal;
    }

    public void setIntVal(int intVal) {
    this.intVal = intVal;
    }

    public String getStrVal() {
    return strVal;
    }

    public void setStrVal(String strVal) {
    this.strVal = strVal;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个未设置 int 字段的 JsonPojo 实例,那么在将其转换为 json jackson 时会为其分配一个默认值 0,如下所示:-

public static void main(String[] args) {
    JsonPojo jsonPojo = new JsonPojo();
    jsonPojo.setStrVal("Hello World");
    try {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(Feature.FAIL_ON_EMPTY_BEANS, false);
        String json = mapper.writeValueAsString(jsonPojo);
        System.out.println(json);
    } catch (Exception e) {

    }

 }
Run Code Online (Sandbox Code Playgroud)

这将输出:- {"intVal":0,"strVal":"Hello World"}

有没有一种方法,我可以忽略intVal的JSON输出时intVal无需转换的数据类型未设置intValInteger?如果我转换intVal为 Integer 那么当这个值没有设置时它将为 nullJsonSerialize(include = Inclusion.NON_EMPTY)并且intVal在转换为 json 期间会跳过。

但是我想知道是否可以在不转换intValIntegerfrom 的情况下实现相同的行为int

我正在使用杰克逊 1.9。

use*_*883 6

Inclusion.NON_EMPTY应该做你期望的。从文档:

值表示仅不包含值为空或被视为空的值的属性。

Java 原语int默认为 0(这被认为是空的)。因此,如果您从未设置它或将其设置为 0,则输出应该是{"strVal":"Hello World"}我在 jackson 2.6.3 上尝试过此操作并且似乎有效,因此我认为 1.9 上存在问题

您可以尝试以下操作,并且可能适用于 1.9:

@JsonInclude(Include.NON_DEFAULT)
private int intVal;
Run Code Online (Sandbox Code Playgroud)

并删除 include = Inclusion.NON_EMPTY

如果 0 是一个有效值,您可以向您的 pojo 添加一个标志。在您调用 setter 时,标志应该变为 true:

    @JsonIgnore
    public boolean set = false;

    public Integer getIntVal() {
        if (!set) {
            return null;
        }
        return Integer.valueOf(intVal);
    }

    public void setIntVal(int intVal) {
        set = true;
        this.intVal = intVal;
    }
Run Code Online (Sandbox Code Playgroud)


can*_*ili 6

您可以尝试@JsonInclude使用jackson.annotations@JsonProperty包中的注释。这是示例代码:

JsonPojo 类:

public class JsonPojo {
@JsonInclude(Include.NON_DEFAULT)
private int intVal;
@JsonProperty
private String strVal;

public int getIntVal() {
    return intVal;
}

public void setIntVal(int intVal) {
    this.intVal = intVal;
}

public String getStrVal() {
    return strVal;
}

public void setStrVal(String strVal) {
    this.strVal = strVal;
}}
Run Code Online (Sandbox Code Playgroud)