Java 使用jackson将对象转换为json时忽略未设置基元类型

Java 使用jackson将对象转换为json时忽略未设置基元类型,java,json,jackson,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 = in

我有一个类,如下所示:-

@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;
    }
}
如果我有一个JsonPojo实例,其中未设置int字段,那么在将其转换为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) {

    }

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

如果没有将
intVal
的数据类型转换为
Integer
而未设置
intVal
,有没有办法在Json输出中忽略
intVal
?如果我将
intVal
转换为整数,则当未设置此值时,该值将为空&执行
JsonSerialize(include=include.NON_EMPTY)
将在转换为json期间跳过
intVal

但是我想知道,如果不将
int
转换为
Integer
,是否可以实现相同的行为


我正在使用jackson 1.9。

包含。非空的
应该做您期望的事情。从文件中:

值,该值指示只有具有值的属性才能 不包括空的或被视为空的

Java原语
int
默认为0(这被认为是空的)。因此,如果您从未将其设置为0或将其设置为0,则输出应为
{“strVal”:“Hello World”}
我在jackson 2.6.3上尝试了此功能,似乎有效,因此我假设1.9上存在问题

您可以尝试以下方法,可能适用于1.9:

@JsonInclude(Include.NON_DEFAULT)
private int intVal;
并删除
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;
    }

以防万一,如果这是一个可接受的解决方案:

我们可以应用自定义过滤器来检查是否设置了
intVal

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

    private boolean isSetIntVal = false;

    @JsonIgnore
    public boolean getIsSetIntVal() {
        return isSetIntVal;
    }

    public int getIntVal() {
        return intVal;
    }

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

    public String getStrVal() {
        return strVal;
    }

    public void setStrVal(String strVal) {
        this.strVal = strVal;
    }
}
实现自定义筛选器,然后应用于编写器:

public static void main(String[] args) {
    SimpleBeanPropertyFilter theFilter = new SimpleBeanPropertyFilter() {
        @Override
        public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider,
                BeanPropertyWriter writer) throws Exception {

            if (!writer.getName().equals("intVal")) {
                writer.serializeAsField(pojo, jgen, provider);
                return;
            }
            if (((JsonPojo) pojo).getIsSetIntVal()) {
                writer.serializeAsField(pojo, jgen, provider);
            }

        }

    };

    JsonPojo jsonPojo = new JsonPojo();
    jsonPojo.setStrVal("Hello World");
    jsonPojo.setIntVal(0);
    try {
        ObjectMapper mapper = new ObjectMapper();
        FilterProvider filters = new SimpleFilterProvider().addFilter("theFilter", theFilter);
        mapper.configure(Feature.FAIL_ON_EMPTY_BEANS, false);
        String json = mapper.writer(filters).writeValueAsString(jsonPojo);
        System.out.println(json);
    } catch (Exception e) {

    }
}

您可以从包中尝试
@JsonInclude
@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;
}}

我更新了问题。实际上,我的意思是,如果未设置
intVal
,则仅在设置时忽略,然后将其包含在json输出中。@tuk在这种情况下,您可以使用带有必要标志的
@JsonInclude
标记。我建议您先将
intVal
的类型更改为
Integer
,然后将其设置为
null
,这样您就可以使用
@JsonInclude(Include.NON\u null)
。您可以使用我在回答中所示的旧版本,但是使用
Include.NON_DEFAULT
的问题是,如果将
intVal
设置为0,它仍然会忽略它,因为
int
的默认值为0。我更新了问题。实际上,我的意思是,如果没有设置intVal,那么只在设置intVal时忽略它,然后将其包含在json输出中。您的问题很有趣。我对作者应用了Jsonfilter,希望这能有所帮助。