Jackson 处理包含 null 的 Map

三年前挖的个坑。

Jackson – Working with Maps and nulls

参考资料就是上文链接,根本原因还是 code 习惯不好,盲目选择全局变量,把控不住。

过程

需求很简单,就是把 Json StringMap 互相转换,这里是用 com.fasterxml.jackson.databind.ObjectMapper 实现的。写个简单的例子,暂时忽略所有 Exception

1
2
private static ObjectMapper objectMapper = new ObjectMapper();
private static Optional output = Optional.empty();
1
2
3
4
5
public static Optional parseJsonStringToMap(String jsonString) throws Exception {
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
output = Optional.of(objectMapper.convertValue(objectMapper.readTree(jsonString), Map.class));
return output;
}
1
2
3
4
5
public static Optional parseMapToJsonString(Map<String, String> inputMap) throws Exception {
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
output = Optional.of(objectMapper.writeValueAsString(inputMap));
return output;
}

很简单嘛,核心就两行。再写一个简单的测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws Exception {
// test parseJsonStringToMap
Optional<Map> output = parseJsonStringToMap("{\"k1\":\"v1\", \"k2\":null, \"k3\":\"v3\"}");
System.out.println(output.get().size());

// test parseMapToJsonString
Map<String, String> inputMap = new LinkedHashMap<>();
inputMap.put("k1", "v1");
inputMap.put("k2", null);
inputMap.put("k3", "v3");
Optional<String> outputString = parseMapToJsonString(inputMap);
System.out.println(outputString.get());
}

结果如下:

1
2
3
4
3
{"k1":"v1","k3":"v3"}

Process finished with exit code 0

知识点

对于 Jackson,他自带一个注解 @JsonInclude.Include,包含以下几个值:

1
2
3
4
5
6
7
8
9
10
11
12
public static enum Include {
ALWAYS,
NON_NULL,
NON_ABSENT,
NON_EMPTY,
NON_DEFAULT,
CUSTOM,
USE_DEFAULTS;

private Include() {
}
}

上面的例子里分别尝试了 ALWAYSNON-NULL,设为 NON-NULL 的时候这个 mapper 就会忽略所有 null 值,仅处理非空的对象,所以在第二个例子里,inputMap 有 3 个 entry,但是转换出来的 outputString 只有 2 个 Json Object。(陈年老坑啊……不知道这几年怎么都没报错……)

嗯就这样。更多的内容看最开始的链接吧。

深得我心!博主晚餐加鸡腿!