2013-03-24 83 views
17

我有一个特定的JSON节点,对应于导入org.codehaus.jackson.JsonNode,而不是 import org.codehaus.jackson.map.JsonNode。删除杰克逊的JSON元素

[ 
    { 
     "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”。有什么办法可以做到这一点?

回答

21

我没有测试过这一点,但我认为这样的事情会做你想要什么:

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

你也可以做到这一点更有效地利用同时杰克逊的原始解析API,但代码将是一个很多梅西耶。

0

由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); 
     } 
+0

我不明白这是多么容易 – eis 2017-10-05 12:41:13

3

According to the JSONObject documentation,JSONObject实现Map.remove,它返回存储在该键上的值。使用它像

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

最近,我来到了这个问题,因为我有一个不寻常的一块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是所需的返回对象,我想除非这是“警告”元素:

HashMap<String, ScoreDetails> results = new HashMap<String, ScoreDetails>(); 

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields(); 
while (fields.hasNext()) { 
    Map.Entry<String, JsonNode> next = fields.next(); 
    if (!next.getKey().equals("warnings")) { 
    results.put(
     next.getKey(), mapper.treeToValue(next.getValue(), ScoreDetails.class)); 
    } 
} 

return results; 
0

杰克逊的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);