在Java中,当将HashMap转化为JSONObject,会有key乱序且值为null的key被自动过滤掉,如以下代码
package com.test;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, Object> testMap = new HashMap<>();
testMap.put("key_1", 1);
testMap.put("key_2", 2);
testMap.put("key_3", 3);
testMap.put("key_4", 4);
testMap.put("key_5", null);
JSONObject jsonObject = JSONUtil.parseObj(testMap);
// 格式化输出json串
String stringPretty = jsonObject.toStringPretty();
System.out.println(stringPretty);
}
}
输出结果
{
"key_3": 3,
"key_2": 2,
"key_1": 1,
"key_4": 4
}
可以看到,输出的顺序并不是我们put的顺序,并且key_5没有了
查看源码
public static JSONObject parseObj(Object obj, boolean ignoreNullValue) {
return parseObj(obj, ignoreNullValue, InternalJSONUtil.isOrder(obj));
}
static boolean isOrder(Object value) {
if (!(value instanceof LinkedHashMap) && !(value instanceof SortedMap)) {
if (value instanceof JSONGetter) {
JSONConfig config = ((JSONGetter)value).getConfig();
if (null != config) {
return config.isOrder();
}
}
return false;
} else {
return true;
}
}
需要我们的map为LinkedHashMap,才会按照原有顺序,并且当参数boolean ignoreNullValue为false时,才不会过滤掉值为null的key,所以我们修改代码为:
package com.test;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import java.util.LinkedHashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, Object> testMap = new LinkedHashMap<>();
testMap.put("key_1", 1);
testMap.put("key_2", 2);
testMap.put("key_3", 3);
testMap.put("key_4", 4);
testMap.put("key_5", null);
JSONObject jsonObject = JSONUtil.parseObj(testMap, false);
// 格式化输出json串
String stringPretty = jsonObject.toStringPretty();
System.out.println(stringPretty);
}
}
输出结果
{
"key_1": 1,
"key_2": 2,
"key_3": 3,
"key_4": 4,
"key_5": null
}