杰克逊 - 序列化包含空元素的列表

时间:2014-12-02 10:21:21

标签: java jackson

我使用Jackson 2.4将对象序列化为JSON 当我序列化对象列表时,如果某些元素为null,则结果JSON字符串包含一些" null"字符串。

如何阻止"null"元素被序列化? ObjectMapper是否有任何配置?我已经设置了"setSerializationInclusion(Include.NON_NULL)"

这是我的代码:

List<String> strings = new ArrayList<>();
strings.add("string 1");
strings.add("string 2");
strings.add(null);
strings.add(null);

序列化后我得到了这个:

[string 1, string 2, null, null]

如何在没有&#34; null&#34;的情况下获取JSON字符串?

[string 1, string 2]

4 个答案:

答案 0 :(得分:2)

使用@JsonInclude注释。

@JsonInclude(Include.NON_NULL)
class Foo {
  String bar;

}

修改

您也可以创建自己的序列化程序。
例如:

public static void main(String[] args) throws JsonProcessingException {

        List<String> strings = new ArrayList<>();
        strings.add("string 1");
        strings.add("string 2");
        strings.add(null);
        strings.add(null);

        ObjectMapper mapper=new ObjectMapper();
        mapper.getSerializerProvider().setNullValueSerializer(new NullSerializer());
        System.out.println(mapper.writeValueAsString(strings));
    }

NullSerializer.java

class NullSerializer extends JsonSerializer<Object>
{
  @Override
  public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused) 
      throws IOException, JsonProcessingException
  {
    jsonGen.writeFieldName("");
  }
}

将打印

["string 1","string 2","",""]

然后你可以删除jsonGen.writeFieldName(“”);打印

["string 1","string 2"]

答案 1 :(得分:1)

尝试使用以下

@JsonInclude(Include.NON_NULL)

另请参阅this以获取更详细的说明。

答案 2 :(得分:0)

您可以通过以下方式阻止它:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) private String checkNullThenSerialize;

把它放在会员声明上。

或者你可以把课程级别也像:

@JsonInclude(Include.NON_NULL)
class CheckNullThenSerialize{
  private String fieldData;
  private String fieldNull;
}

您也可以Include.NON_EMPTY改为@JsonInclude来尝试Include.NON_NULL

对于ObjectMapper通过此映射器序列化的任何类中的任何空字段将被忽略):

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);

查看Here's有关此主题的完整详细信息。

答案 3 :(得分:0)

建议实现自定义NullSerializer是一个好主意,在我的情况下,我不希望忽略所有空值(例如,外部集合),所以只需稍微调整就可以让两件事都有效。< / p>

class NullSerializer extends JsonSerializer<Object>{
    @Override
    public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused) 
  throws IOException, JsonProcessingException {
        //any null outside of a collection will be serialized (as long as SerilizationInclusion allows nulls)
        if (!jsonGen.getOutputContext().inArray()) {
            jsonGen.writeNull();
        }
    }
}

使用该自定义NullSerializer,序列化以下类:

class MyTest {
    public List<String> list = Arrays.asList("hello", null, "world", null);
    public Object goodNull = null;
}

生成JSON:

{ "list":["hello","world"], "goodNull":null}