使用jackson删除JSON元素

我有一个特定的JSON节点,对应于导入org.codehaus.jackson.JsonNode,而不是导入org.codehaus.jackson.map.JsonNode。

[ { "givenName": "Jim", "formattedName": "jimJackson", "familyName": null, "middleName": "none", "honorificPrefix": "mr", "honorificSuffix": "none" }, { "givenName": "john", "formattedName": "johnLasher", "familyName": null, "middleName": "none", "honorificPrefix": "mr", "honorificSuffix": "none" }, { "givenName": "carlos", "formattedName": "carlosAddner", "familyName": null, "middleName": "none", "honorifiPrefix": "mr", "honorificSuffix": "none" }, { "givenName": "lisa", "formattedName": "lisaRay", "familyName": null, "middleName": "none", "honorificPrefix": "mrs", "honorificSuffix": "none" }, { "givenName": "bradshaw", "formattedName": "bradshawLion", "familyName": null, "middleName": "none", "honorificPrefix": "mr", "honorificSuffix": "none" }, { "givenName": "phill", "formattedName": "phillKane", "familyName": null, "middleName": "none", "honorificPrefix": "mr", "honorificSuffix": "none" }, { "givenName": "Gabriel", "formattedName": "gabrielMoosa", "familyName": null, "middleName": "none", "honorificPrefix": "mr", "honorificSuffix": "none" } ] 

我想从上面数组的所有JSON节点中删除“familyName”和“middleName”。 有没有办法实现这个目标?

我没有对此进行测试,但我认为这样的事情会做你想要的:

 import org.codehaus.jackson.node.ObjectNode; // ... for (JsonNode personNode : rootNode) { if (personNode instanceof ObjectNode) { ObjectNode object = (ObjectNode) personNode; object.remove("familyName"); object.remove("middleName"); } } 

您也可以使用Jackon的原始解析API更有效地执行此操作,但代码会更加混乱。

根据JSONObject文档 ,JSONObject实现了Map.remove,它返回存储在该键中的值。 用它就好

 JSONObject json = new JSONObject(); json.put("key", "value"); String str = (String)json.remove("key"); 

Jackson的ObjectMapper只用了几步就能给出解决方案。

将json数据保存在一个名为’data.json’的文件中。 将代码复制到没有import语句的函数中并调用该函数。 生成的JSON将写入新文件’data1.json’。

 import java.io.File; import java.io.IOException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(new File("data.json")); for (JsonNode node : jsonNode) { ((ObjectNode)node).remove("familyName"); ((ObjectNode)node).remove("middleName"); } objectMapper.writeValue(new File("data1.json"), jsonNode); 

gsteff编写的答案也可以使用,但我认为更简单的方法是使用对象映射器转换为JSONArray而不是JsonNode并从那里开始。

 ObjectMapper mapper = new ObjectMapper(); String stringJsonArray = mapper.writeValueAsString(list); JSONArray csvDatabindedtoBean = new JSONArray(stringJsonArray); JSONArray finalArray = new JSONArray(); for (int val = 0; val < csvDatabindedtoBean.length(); val++) { JSONObject finalObject = csvDatabindedtoBean.getJSONObject(val); finalObject.remove("familyName"); finalObject.remove("middleName"); } finalArray.put(finalObject); } 

我最近遇到了这个问题,因为我有一个不寻常的JSON,我需要删除一个元素:

 { "allan": { "score": 88 }, "bill": { "score": 75 }, "cassie": { "score": 96 }, "warnings": [ { "name": "class_low_numbers", "message": "this class is has less than 10 students" }] } 

前三个元素代表一个人和一个相应的分数对象。 最后一个“警告”与得分对象不匹配,那是我想删除的那个。

从上面的gsteff的答案中取出rootNode作为起始JsonNode,我发现删除它的方法是遍历每个节点,将节点的对象映射版本添加到HashMap,这是我想要的返回对象, 除非它是“警告”元素:

 HashMap results = new HashMap(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Iterator> fields = rootNode.fields(); while (fields.hasNext()) { Map.Entry next = fields.next(); if (!next.getKey().equals("warnings")) { results.put( next.getKey(), mapper.treeToValue(next.getValue(), ScoreDetails.class)); } } return results; 

您可以创建一个新的JSONObject,读取除“familyName”和“middleName”之外的所有节点,然后将它们全部保存到新文件中。 这是一个例子。 JSON.Simple示例 – 读写JSON