Удаление элементов JSON с помощью jackson

У меня есть конкретный JSON Node, который соответствует import org.codehaus.jackson.JsonNode, а не import org.codehaus.jackson.map.JsonNode.

[
    {
        "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 указанного массива. Есть ли способ достичь этого?

Ответ 1

Я не тестировал это, но я думаю, что что-то вроде этого сделает то, что вы хотите:

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 raw, но код будет намного более беспорядочным.

Ответ 2

Согласно документации JSONObject, JSONObject реализует Map.remove, который возвращает значение, хранящееся на этом ключе. Используйте его как

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

Ответ 3

Также может быть использован ответ, написанный 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);
        }

Ответ 4

Недавно я пришел к этому вопросу, потому что у меня был необычный кусок 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-ответа выше, способ, которым я нашел, чтобы удалить это, состоял в том, чтобы перебирать каждый из узлов, добавляя сопоставленную объекту версию node к 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;

Ответ 5

ObjectMapper от Jackson дает решение только с несколькими шагами.

Сохраните данные 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);

Ответ 6

Вы можете просто создать новый JSONObject, прочитать все узлы, кроме "familyName" и "middleName", а затем сохранить их все в новый файл. Вот пример. Пример JSON.Simple - чтение и запись JSON