当前项目遇到一个问题,就是深层嵌套的json(cn.hutool.json.JSONObject)结构如果当中有某个key的值是null,序列化时就会报JSONNull错误,在网上搜了一下,并没有找到解决方法。思考了一下,可以将value值是null的元素替换成"",由于是深层递归,采用递归方法,话不多说,直接上代码
private void removeNull(JSONObject object) {
object.keySet().forEach(key->{
Object o = object.get(key);
if(o instanceof JSONArray) {
object.getJSONArray(key).forEach(o1 -> {
if(o1 instanceof JSONObject) {
removeNull((JSONObject) o1);
}
});
}
if(o instanceof JSONObject) {
removeNull(object.getJSONObject(key));
}
if(o instanceof JSONNull) {
object.put(key,"");
}
});
}
/********************************************2010-3-24**************************/
上面的方法有一种情况会报错,就是{"key":[null]},所以更新代码
private void removeNull(JSONObject object) {
object.keySet().forEach(key->{
Object o = object.get(key);
if (o instanceof JSONArray) {
removeNull((JSONArray) o);
}
if (o instanceof JSONObject) {
removeNull(object.getJSONObject(key));
}
if (o instanceof JSONNull) {
object.put(key, "");
}
});
}
private void removeNull(JSONArray array) {
Iterator<Object> iterator = array.iterator();
while (iterator.hasNext()) {
Object o1 = iterator.next();
if (o1 instanceof JSONObject) {
removeNull((JSONObject) o1);
}
if(o1 instanceof JSONArray) {
removeNull((JSONArray) o1);
}
if(o1 instanceof JSONNull) {
iterator.remove();
}
}
}
remove null的方式
public static void removeNull(JSONObject object) {
Iterator<String> iterator = object.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Object o = object.get(key);
if (o instanceof JSONArray) {
removeNull((JSONArray) o);
}
if (o instanceof JSONObject) {
removeNull(object.getJSONObject(key));
}
if(o instanceof JSONNull) {
iterator.remove();
object.remove(key);
}
}
}
public static void removeNull(JSONArray array) {
Iterator<Object> iterator = array.iterator();
while (iterator.hasNext()) {
Object o1 = iterator.next();
if (o1 instanceof JSONObject) {
removeNull((JSONObject) o1);
}
if(o1 instanceof JSONArray) {
removeNull((JSONArray) o1);
}
if(o1 instanceof JSONNull) {
iterator.remove();
}
}
}