我是一名初学Java程序员,所以如果我的问题有点愚蠢,我很抱歉。
我有一个看起来像这样的JSON对象:
{
"element1" : {
"generated_name_1": {
"a" : {"isReady":false}
},
"generated_name_2":{},
"generated_name_3":{},
"generated_name_4":{}
},
"element2" : {
"generated_name_5" : {
"a" : {"isReady":false},
"g" : {"isReady":false}
}
},
"element3" : {
"a" : { "isReady":false},
"n":{}
}
}
我想通过并删除每个与其关联的空值的元素,例如“generated_name_2”和“n”。我不知道这些元素的名称是什么,我不知道嵌套到JSON树中的距离是多少。
我知道我必须写一个递归程序,这就是我想出来的:
public static void cleanJsonNodes(ObjectNode myJsonNode){
for (JsonNode currentNode : myJsonNode){
if (currentNode.size() == 0){
myJsonNode.remove(currentNode);
} else {
cleanJsonNodes((ObjectNode)currentNode);
}
}
}
当然,这不起作用,但我不确定从哪里开始,我已经在互联网上搜索无济于事。
请有人帮助我!
答案 0 :(得分:2)
我只想用Json向我们展示如何做到的方向:
JSONObject jsonObj = new JSONObject(_message);
Map<String, JSONObject> map = jsonObj.getMap();
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()){
String key = it.next();
JSONObject o = map.get(key);
if(o.length() == 0){
it.remove();
}
}
当JSONObject
加载{}
时,其长度为0,因此您可以删除它。
作为旁注,您可以在递归中使用此方法,如:
JSONObject jsonObj = new JSONObject(_message);
invoke(jsonObj);
...
private static void invoke(JSONObject jsonObj) {
Map<String, JSONObject> map = jsonObj.getMap();
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()){
String key = it.next();
JSONObject o = map.get(key);
if(o.length() == 0){
it.remove();
}
else{
invoke(o);
}
}
}
我没有添加任何验证,但您肯定需要验证jsonObj.getMap()
...
答案 1 :(得分:2)
我还没有测试过,但你可能想要这样的东西:
public static void stripEmpty(JsonNode node) {
Iterator<JsonNode> it = node.iterator();
while (it.hasNext()) {
JsonNode child = it.next();
if (child.isObject() && child.isEmpty(null))
it.remove();
else
stripEmpty(child);
}
}
答案 2 :(得分:1)