2016-04-07 76 views
1

将对象转换为JSON忽略不设置原语类型我有一个类看起来像下面: -同时使用杰克逊

@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,如下图所示杰克逊分配一个默认的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设置为intVal的数据类型为Integer时,Json输出中的?如果我将intVal转换为Integer,那么当这个值没有设置时,它将为空&做JsonSerialize(include = Inclusion.NON_EMPTY)在转换到json期间将跳过intVal

但我想知道是否可以实现相同的行为,而无需将intValint转换为Integer

我正在使用杰克逊1.9。

+0

你的问题很有趣。我向作者申请了一个Jsonfilter,希望这可以提供帮助。 –

回答

2

您合作请从jackson.annotations包中尝试@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; 
}} 
+0

我更新了问题。其实我的意思是,如果'intVal'没有设置,那么只有在设置时才会忽略它,然后将它包含在json输出中。 – tuk

+0

@tuk在这种情况下,您可以使用具有必要标志的'@ JsonInclude'标签。我建议你将'intVal'的类型改为'Integer'并且最初将它设置为'null',这样你就可以使用'@JsonInclude(Include.NON_NULL)'。你可以使用旧的,因为我在答案中显示,但使用'Include.NON_DEFAULT'的问题是,如果将'intVal'设置为0,它仍然会忽略它,因为'int'的默认值为0。 –

1

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

该值指示只有值为 的值为null或被视为空的属性不包括在内。

Java原始码int默认为0(这被认为是空的)。所以,如果你从来没有设置它,或者你把它设置为0输出应该是{"strVal":"Hello World"}我在杰克逊2.6.3上试过这个,似乎工作,所以我假设有一个问题在1.9

你可以尝试以下,也许作品在1.9:

@JsonInclude(Include.NON_DEFAULT) 
private int intVal; 

,并删除include = Inclusion.NON_EMPTY

如果0是你可以一个标志添加到您的POJO有效值。在你曾经致电二传手的标志应该转向真正:

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

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

我们可以应用自定义过滤器来检查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) { 

    } 
} 
+0

我更新了问题。其实我的意思是,如果没有设置intVal,那么只有在设置后才会忽略,然后将其包含在json输出中。 – tuk