Jackson序列化Map时包含null值

7
我有以下的POJO,我想使用Jackson 2.9.x进行序列化。
static class MyData {
  public Map<String, MyInnerData> members;
}
static class MyInnerData {
  public Object parameters;
  public boolean isPresent;
}

现在,如果我使用以下示例代码填充数据,如下所示:
Map<String, Object> nodeMap = new LinkedHashMap<>();
nodeMap.put("key-one", "val1");
nodeMap.put("key-null", null);
nodeMap.put("key-two", "val2");
Map<String, Object> child1 = new LinkedHashMap<>();
child1.put("c1", "v1");child1.put("c2", null);
nodeMap.put("list", child1);

MyInnerData innerData1 = new MyInnerData();
innerData1.parameters = nodeMap;
innerData1.isPresent = true;
MyData myData = new MyData();
myData.members = new LinkedHashMap<>();
myData.members.put("data1", innerData1);

// serialize the data
ObjectMapper mapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
String actual = mapper.writeValueAsString(myData);
System.out.println(actual);

这最终会打印出来。
{"members":{"data1":{"parameters":{"key-one":"val1","key-two":"val2","list":{"c1":"v1"}},"isPresent":true}}}

期望的输出(同样的代码在Jackson 2.8.x中给出正确的输出)

{"members":{"data1":{"parameters":{"key-one":"val1","key-null":null,"key-two":"val2","list":{"c1":"v1","c2":null}},"isPresent":true}}}

如果我在映射器上删除setSerializationInclusion(JsonInclude.Include.NON_NULL),我将获得所需的输出,但无法更改的现有配置。然而,我可以对POJO进行更改。
为了获得所需的输出,最少需要做什么更改?

2
不确定注释是否可传递,您可以尝试在MyData类或成员属性上使用@JsonInclude(Include.ALWAYS) - pdem
@pdem,谢谢,那个方法有效。你想将其作为答案发布吗? - Neo
谢谢,你可以发布它,我没有在类和成员上尝试过,你可能比我更有信息,还有完整的工作示例。 - pdem
1个回答

14

您需要像这样配置您的对象:mapper.setDefaultPropertyInclusion(JsonInclude.Include.ALWAYS);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接