从JSON数组中删除对象

时间:2019-03-30 19:38:17

标签: java arrays json

我有一个看起来像这样的JSON数组:

[ {
  "name" : "1",
  "date" : "30/03 19:36:20"
}, {
  "name" : "12",
  "date" : "30/03 19:36:21"
}, {
  "name" : "123",
  "date" : "30/03 19:36:22"
}, {
  "name" : "1234",
  "date" : "30/03 19:36:23"
}, {
  "name" : "12345",
  "date" : "30/03 19:36:25"
} ]

我怎么可能用java中的名称删除一个对象,就像让我们假设要删除1个对象一样?

 {
  "name" : "1",
  "date" : "30/03 19:36:20"
},

我怎么可能只删除那些行,因为目前我的代码会删除文件中的所有条目

public static void deleteSavefile() throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(new File("savefiles.json"));
    for (JsonNode node : jsonNode) {
        ((ObjectNode)node).remove("name");
        ((ObjectNode)node).remove("date");
    }
    objectMapper.writeValue(new File("savefiles.json"), jsonNode);
}

3 个答案:

答案 0 :(得分:1)

如果jsonNodeArray的{​​{1}},则Objects返回Iterator <jsonNode.elements(),通过使用JsonNode>条件检查具有{ {1}},然后删除整个节点

if

答案 1 :(得分:1)

如果您想从ArrayNode中删除一个元素,只需

final JsonNode json = objectMapper.readTree(new File("savefiles.json"));

if (json.isArray()) {
    for (final Iterator<JsonNode> i = json.elements(); i.hasNext(); ) {
        final JsonNode jsonNode = i.next();

        if ("1".equals(jsonNode.get("name").asText())) {
            i.remove();
        }
    }
}

这将创建一个新实例。原始的TreeNode(是ArrayNode)得到保留。
比较时还要注意.asText()

流版本是

final ArrayNode filtered =
        StreamSupport.stream(json.spliterator(), false)
                     .filter(e -> !"1".equals(e.get("name").asText()))
                     .collect(Collector.of(
                             objectMapper::createArrayNode,
                             (array, element) -> array.add(element),
                             (result, toMerge) -> result.addAll(result)
                     ));

答案 2 :(得分:1)

读取列表中的json,在列表中进行迭代,找到元素并将其删除。

ObjectMapper objectMapper = new ObjectMapper();
// read in a list
List<Map<String, String>> jsonList = objectMapper.readValue(new File("savefiles.json"), new TypeReference<List<Map<String, String>>>(){});

// remove object with name "1"
jsonList = jsonList.stream().filter(e -> !"1".equals(e.get("name"))).collect(Collectors.toList());

通过定义具有两个字段namedate的bean类,可以进一步简化操作,然后可以使用List<Map<String, String>代替List<BeanClass>

// read in a list
List<BeanClass> jsonList = objectMapper.readValue(new File("savefiles.json"), new TypeReference<List<BeanClass>>(){});

// remove object with name "1"
jsonList = jsonList.stream().filter(e -> !"1".equals(e.getName())).collect(Collectors.toList());

直接在此处编写代码,可能会有一些错字。