2013-03-24 3 views
17

У меня есть конкретный узел JSON, который соответствует импорту org.codehaus.jackson.JsonNode, а не import org.codehaus.jackson.map.JsonNode.Удаление элементов JSON с 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" 
    } 
] 

Я хочу, чтобы удалить «FamilyName» и «MiddleName» из всех JSON узлов выше массива. Есть ли способ достичь этого?

ответ

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 Jackon, но код будет много messier.

0

Ответ, написанный gsteff, также может быть использован, но я подумал, что проще использовать объект mapper для преобразования в 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

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

Первых три элемента представляет человек и соответствующий оценка объекта. Последние «предупреждения» не соответствовали объекту оценки, и это тот, который я хотел удалить.

Принимая rootNode как начальный JsonNode из ответа gsteff выше, способ, которым я нашел удаление, состоял в том, чтобы перебирать каждый из узлов, добавляя сопоставленную версию объекта узла в 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'. Скопируйте следующий код в функцию без операторов импорта и вызовите функцию. Получившийся 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);