我试图从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,
},
{
}
]
如何删除它?
答案 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,然后在需要时过滤掉不需要的对象来实现。
与使用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());
}
}