使用Jackson从JSON文件中删除空元素

时间:2015-06-18 13:45:17

标签: java json jackson

我试图从JSON文件中删除一个元素:

[  
         {  
            "Lorem Ipsum ":4,
         },
         {  
            "Lorem Ipsum ":5,
         },
         {  
            "keyToRemove": value,
         }
]

使用以下代码,我可以删除密钥和值:

for (JsonNode personNode : rootNode) {
    if (personNode instanceof ObjectNode) {
       if (personNode.has("keyToRemove")) {
          ObjectNode object = (ObjectNode) personNode;  
          object.remove("keyToRemove");
       }
    }
}

但我仍然有一个空括号:

[  
         {  
            "Lorem Ipsum ":4,
         },
         {  
            "Lorem Ipsum ":5,
         },
         {  
         }
]

如何删除它?

2 个答案:

答案 0 :(得分:5)

你没有删除整个对象,而是删除了它的一个元素。

object.remove("keyToRemove"); 

将从keyToRemove中删除元素object。在这种情况下,object基本上是json object,而不是json array

要移除整个对象,您不应该使用for loop。 您可以尝试使用Iterator代替:

    Iterator<JsonNode> itr = rootNode.iterator();

    while(itr.hasNext()){
        JsonNode personNode = itr.next();
        if(personNode  instanceof ObjectNode){
           if (personNode.has("keyToRemove")) {
             // ObjectNode object = (ObjectNode) personNode;  
             // object.remove("keyToRemove");
             itr.remove();
           }
        }
    };

答案 1 :(得分:2)

争取可重用性

nafas的回答似乎为您提供了解决此问题的方法。正如另一种方法:删除不需要的对象可能与单个用例相关联,因此将去除与反序列化分离可能是理想的。您可以通过按原样反序列化JSON,然后在需要时过滤掉不需要的对象来实现。

创建一个代表您的JSON

的对象

与使用JsonNode相比,这样的对象允许您将JSON转换为Java并以更正式的方式对数据执行操作。 不确定杰克逊在属性名称中如何使用空格,这只是为了匹配给出的示例JSON。

public class CustomPojo {
    private final Integer keyToKeep;
    private final String keyToRemove;

    @JsonCreator
    public CustomPojo(@JsonProperty("Lorem Ipsum ") Integer keyToKeep,
                      @JsonProperty("keyToRemove") String keyToRemove) {
        this.keyToKeep = keyToKeep;
        this.keyToRemove = keyToRemove;
    }

    @JsonProperty("Lorem Ipsum ")
    public Integer getKeyToKeep() {
        return keyToKeep;
    }

    @JsonProperty("keyToRemove")
    public String getKeyToRemove() {
        return keyToRemove;
    }
}

添加删除不需要的对象的方法

添加删除对象的方法会将删除与反序列化分离。假设您将JSON反序列化为资源中的数组。

public class CustomPojoService {
    public static List<CustomPojo> removeUnwantedKeys(List<CustomPojo> customPojoArray) {
        return customPojoArray.stream().filter(
                customPojo -> customPojo.getKeyToRemove() == null
        ).collect(Collectors.toList());
    }
}