2013-03-24 70 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);