三年前挖的个坑。
Jackson – Working with Maps and nulls
参考资料就是上文链接,根本原因还是 code 习惯不好,盲目选择全局变量,把控不住。
过程
需求很简单,就是把 Json String
和 Map
互相转换,这里是用 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 { Optional<Map> output = parseJsonStringToMap("{\"k1\":\"v1\", \"k2\":null, \"k3\":\"v3\"}"); System.out.println(output.get().size());
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() { } }
|
上面的例子里分别尝试了 ALWAYS
和 NON-NULL
,设为 NON-NULL
的时候这个 mapper
就会忽略所有 null
值,仅处理非空的对象,所以在第二个例子里,inputMap
有 3 个 entry
,但是转换出来的 outputString
只有 2 个 Json Object
。(陈年老坑啊……不知道这几年怎么都没报错……)
嗯就这样。更多的内容看最开始的链接吧。