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

5

我正在尝试从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个回答

5
你并没有删除整个对象,而是删除了其中的一个元素。
object.remove("keyToRemove"); 

该函数将从您的object中删除一个元素keyToRemove。在这种情况下,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();
           }
        }
    };

2

力求可重用性

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

创建表示您的JSON的对象

这样的对象将允许您将JSON转换为Java,并以比使用JsonNode更正式的方式对数据执行操作。不确定Jackson在属性名称中使用空格的情况下会发生什么,这只是为了匹配给定的示例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());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接