2013-03-24 20 views
17

Mam określony węzeł JSON, który odpowiada zaimportowaniu org.codehaus.jackson.JsonNode, a nie zaimportowaniu org.codehaus.jackson.map.JsonNode.Usuwanie elementów JSON za pomocą jackson

[ 
    { 
     "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" 
    } 
] 

Chcę usunąć "familyName" i "middleName" ze wszystkich węzłów JSON powyższej tablicy. Czy jest jakiś sposób, aby to osiągnąć?

Odpowiedz

21

Nie testowałem tego, ale myślę, że coś takiego zrobi to, co chcesz:

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

Można również zrobić to bardziej efektywne wykorzystanie surowca parsowania API Jackon, ale kod będzie dużo bałaganu.

0

Można również użyć odpowiedzi napisanej przez gsteff, ale pomyślałem, że łatwiej jest użyć programu odwzorowującego obiekty, aby przekonwertować go na JSONArray zamiast JsonNode i przejść dalej.

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

Nie widzę, jak to jest łatwiejsze – eis

3

According to the JSONObject documentation, JSONObject realizuje Map.remove, która zwraca wartość zapisaną w tym kluczu. Używaj go jak

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

Niedawno przyszedł na to pytanie, ponieważ miałem niezwykły kawałek JSON, że muszę usunąć element:

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

pierwsze trzy elementy stanowią osoby i odpowiedni wynik obiektu. Ostatnie "ostrzeżenia" nie pasowały do ​​obiektu wynikowego i to ten, który chciałem usunąć.

Biorąc Rootnode jako JsonNode począwszy od odpowiedzi gsteff jest powyżej, tak, jak stwierdzono, aby usunąć to iterację każdy z węzłów dodanie obiektu odwzorowywane wersji węzła HashMap który był żądany obiekt powrotu że chciałem chyba to był „ostrzeżenia” pierwiastek:

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 Jackson daje rozwiązanie z zaledwie kilku krokach.

Zapisz dane json w pliku, powiedz "data.json". Skopiuj następujący kod do funkcji bez instrukcji importu i wywołaj funkcję. Wynikowy JSON zostanie zapisany w nowym pliku "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); 
Powiązane problemy