【问题标题】:How an optional property can be ignored when using jackson to convert Java object使用jackson转换Java对象时如何忽略可选属性
【发布时间】:2014-07-08 02:06:41
【问题描述】:

我正在使用 Jackson 1.9.2(org.codehaus.jackson) 从 Java 对象转换为匹配的 JSON 构造。这是我的 java 对象:

Class ColorLight {
    String type;
    boolean isOn;
    String value;

    public String getType(){
        return type;
    }

    public setType(String type) {
        this.type = type;
    }

    public boolean getIsOn(){
        return isOn;
    }

    public setIsOn(boolean isOn) {
        this.isOn = isOn;
    }

    public String getValue(){
        return value;
    }

    public setValue(String value) {
        this.value = value;
    }
}

如果我进行以下转换,我会得到我想要的结果。

ColorLight light = new ColorLight();
light.setType("red");
light.setIsOn("true");
light.setValue("255");
objectMapper mapper = new ObjectMapper();
jsonString = mapper.writeValueAsString();

jsonString 会是这样的:

{"type":"red","isOn":"true", "value":"255"}

但有时我没有 isOn 属性的值

ColorLight light = new ColorLight();
light.setType("red");
light.setValue("255");

但是jsonString还是这样的:

{"type":"red","isOn":"false", "value":"255"}

其中“isOn:false”是 Java 布尔类型的默认值,我不希望它存在。 如何像这样删除最终 json 构造中的 isOn 属性?

{"type":"red","value":"255"}

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您可以在 1.x 注释中使用 @JsonSerialize(include = JsonSerialize.Inclusion.NON_DEFAULT) 标记您的类,这表明只有值与默认设置不同的属性(即当 Bean 使用其无参数构造函数构造时它们具有的值)才能被包括。

    @JsonInclude(JsonInclude.Include.NON_DEFAULT) 注解用于版本 2.x。

    这是一个例子:

    public class JacksonInclusion {
    
        @JsonSerialize(include = JsonSerialize.Inclusion.NON_DEFAULT)
        public static class ColorLight {
            public String type;
            public boolean isOn;
    
            public ColorLight() {
            }
    
            public ColorLight(String type, boolean isOn) {
                this.type = type;
                this.isOn = isOn;
            }
        }
    
        public static void main(String[] args) throws IOException {
            ColorLight light = new ColorLight("value", false);
            ObjectMapper mapper = new ObjectMapper();
            System.out.println(mapper.writeValueAsString(light));
        }
    }
    

    输出:

    {"type":"value"}
    

    【讨论】:

      【解决方案2】:

      如果不存在则跳过该值:

      • 使用Boolean 代替boolean 原语(boolean 值始终设置为truefalse)。
      • 使用@JsonInclude(Include.NON_NULL)@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 配置Jackson 不序列化空值,具体取决于版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        • 2018-03-30
        • 1970-01-01
        相关资源
        最近更新 更多