2013-03-24 42 views
17

Ho un nodo JSON specifico che corrisponde a import org.codehaus.jackson.JsonNode e non import org.codehaus.jackson.map.JsonNode.Rimozione elementi JSON con 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" 
    } 
] 

voglio rimuovere il "familyName" e "middleName" da tutti i nodi JSON dell'array sopra. C'è un modo per raggiungere questo obiettivo?

risposta

21

non ho ancora testato questo, ma penso che qualcosa di simile sarebbe fare quello che vuoi:

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

Si potrebbe anche fare questo in modo più efficiente utilizzando API analisi cruda di Jackon, ma il codice sarebbe un molto più disordinato.

0

La risposta scritta da gsteff può essere utilizzata anche, ma ho pensato che un modo più semplice era utilizzare il mappatore di oggetti per convertire in JSONArray invece di JsonNode e andare da lì.

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

Non vedo come sia più facile – eis

3

According to the JSONObject documentation, JSONObject implementa Map.remove, che restituisce il valore memorizzato in quella chiave. Usalo come

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

Recentemente ho venuto a questa domanda, perché ho avuto un pezzo insolito di JSON che avevo bisogno di rimuovere un elemento di:

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

I primi tre elementi rappresentano una persona e un rispettivo segnare l'oggetto. L'ultimo "avvertimenti" non corrispondeva all'oggetto dello spartito ed è quello che volevo rimuovere.

Prendendo il rootNode come JsonNode di partenza dalla risposta di gsteff sopra, il modo in cui ho trovato di rimuovere questo era iterare attraverso ciascuno dei nodi, aggiungendo una versione mappata dell'oggetto del nodo ad una HashMap che era l'oggetto di ritorno desiderato che volevo a meno era l'elemento di "avvertimenti":

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 di Jackson dà la soluzione con pochi passi.

Salvare i dati JSON in un file dire "data.json". Copia seguendo il codice in una funzione senza istruzioni import e invoca la funzione. Il JSON risultante verrà scritto in un nuovo file '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); 
Problemi correlati