diff --git a/jackson-modules/jackson/src/main/java/com/baeldung/jackson/jsonnode/GetAllKeysFromJSON.java b/jackson-modules/jackson/src/main/java/com/baeldung/jackson/jsonnode/GetAllKeysFromJSON.java new file mode 100644 index 0000000000..d740b457af --- /dev/null +++ b/jackson-modules/jackson/src/main/java/com/baeldung/jackson/jsonnode/GetAllKeysFromJSON.java @@ -0,0 +1,172 @@ +package com.baeldung.jackson.jsonnode; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; + +public class GetAllKeysFromJSON { + + public static List getKeysInJsonUsingMaps(String json, ObjectMapper mapper) { + List keys = new ArrayList<>(); + + try { + Map jsonElements = mapper.readValue(json, new TypeReference>() { + }); + getAllKeys(jsonElements, keys); + return keys; + + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + return keys; + } + + public static void getAllKeys(Map jsonElements, List keys) { + + jsonElements.entrySet() + .forEach(entry -> { + keys.add(entry.getKey()); + if (entry.getValue() instanceof Map) { + Map map = (Map) entry.getValue(); + getAllKeys(map, keys); + } else if (entry.getValue() instanceof List) { + List list = (List) entry.getValue(); + list.forEach(listEntry -> { + if (listEntry instanceof Map) { + Map map = (Map) listEntry; + getAllKeys(map, keys); + } + }); + } + }); + } + + public static List getKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) { + List keys = new ArrayList<>(); + + try { + JsonNode jsonNode = mapper.readTree(json); + Iterator iterator = jsonNode.fieldNames(); + iterator.forEachRemaining(e -> keys.add(e)); + + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return keys; + } + + public static List getAllKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) { + List keys = new ArrayList<>(); + + try { + JsonNode jsonNode = mapper.readTree(json); + getAllKeysUsingJsonNodeFieldNames(jsonNode, keys); + + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return keys; + } + + public static List getAllKeysInJsonUsingJsonNodeFields(String json, ObjectMapper mapper) { + List keys = new ArrayList<>(); + + try { + JsonNode jsonNode = mapper.readTree(json); + getAllKeysUsingJsonNodeFields(jsonNode, keys); + + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return keys; + } + + public static void getAllKeysUsingJsonNodeFields(JsonNode jsonNode, List keys) { + + if (jsonNode.isObject()) { + Iterator> fields = jsonNode.fields(); + + fields.forEachRemaining(field -> { + keys.add(field.getKey()); + getAllKeysUsingJsonNodeFieldNames((JsonNode) field.getValue(), keys); + }); + } else if (jsonNode.isArray()) { + ArrayNode arrayField = (ArrayNode) jsonNode; + arrayField.forEach(node -> { + getAllKeysUsingJsonNodeFieldNames(node, keys); + }); + } + + } + + public static void getAllKeysUsingJsonNodeFieldNames(JsonNode jsonNode, List keys) { + + if (jsonNode.isObject()) { + Iterator fieldNames = jsonNode.fieldNames(); + + fieldNames.forEachRemaining(fieldName -> { + keys.add(fieldName); + getAllKeysUsingJsonNodeFieldNames(jsonNode.get(fieldName), keys); + }); + } else if (jsonNode.isArray()) { + ArrayNode arrayField = (ArrayNode) jsonNode; + arrayField.forEach(node -> { + getAllKeysUsingJsonNodeFieldNames(node, keys); + }); + } + + } + + public static List getKeysInJsonUsingJsonParser(String json, ObjectMapper mapper) { + List keys = new ArrayList<>(); + + try { + JsonNode jsonNode = mapper.readTree(json); + JsonParser jsonParser = jsonNode.traverse(); + while (!jsonParser.isClosed()) { + if (jsonParser.nextToken() == JsonToken.FIELD_NAME) { + keys.add((jsonParser.getCurrentName())); + } + } + } catch (JsonProcessingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return keys; + } + + public static List getKeysInJsonUsingJsonParser(String json) { + List keys = new ArrayList<>(); + + try { + JsonFactory factory = new JsonFactory(); + JsonParser jsonParser = factory.createParser(json); + while (!jsonParser.isClosed()) { + if (jsonParser.nextToken() == JsonToken.FIELD_NAME) { + keys.add((jsonParser.getCurrentName())); + } + } + } catch (JsonProcessingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return keys; + } +} diff --git a/jackson-modules/jackson/src/test/java/com/baeldung/jackson/jsonnode/GetAllKeysFromJSONUnitTest.java b/jackson-modules/jackson/src/test/java/com/baeldung/jackson/jsonnode/GetAllKeysFromJSONUnitTest.java new file mode 100644 index 0000000000..b547422aad --- /dev/null +++ b/jackson-modules/jackson/src/test/java/com/baeldung/jackson/jsonnode/GetAllKeysFromJSONUnitTest.java @@ -0,0 +1,56 @@ +package com.baeldung.jackson.jsonnode; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class GetAllKeysFromJSONUnitTest { + + private static String json = "{\r\n" + " \"Name\":\"Craig\",\r\n" + " \"Age\":10,\r\n" + " \"BookInterests\":[\r\n" + " {\r\n" + " \"Book\":\"The Kite Runner\",\r\n" + " \"Author\":\"Khaled Hosseini\"\r\n" + " },\r\n" + + " {\r\n" + " \"Book\":\"Harry Potter\",\r\n" + " \"Author\":\"J. K. Rowling\"\r\n" + " }\r\n" + " ],\r\n" + " \"FoodInterests\":{\r\n" + " \"Breakfast\":[\r\n" + " {\r\n" + + " \"Bread\":\"Whole wheat\",\r\n" + " \"Beverage\":\"Fruit juice\"\r\n" + " },\r\n" + " {\r\n" + " \"Sandwich\":\"Vegetable Sandwich\",\r\n" + " \"Beverage\":\"Coffee\"\r\n" + + " }\r\n" + " ]\r\n" + " }\r\n" + "}"; + + private static ObjectMapper mapper = new ObjectMapper(); + + // Top level keys : [Name, Age, BookInterests, FoodInterests] + // All keys: [Name, Age, BookInterests, Book, Author, Book, Author, FoodInterests, Breakfast, Bread, Beverage, Sandwich, Beverage] + + @Test + public void givenAJsonNode_whenUsingFieldNamesMethod_thenWeGetTopFieldNames() { + List keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonNodeFieldNames(json, mapper); + assertEquals(4, keys.size()); + } + + @Test + public void givenAJsonNode_whenUsingFieldNamesMethodForAllNodes_thenWeGetAllFieldNames() { + List keys = GetAllKeysFromJSON.getAllKeysInJsonUsingJsonNodeFieldNames(json, mapper); + assertEquals(13, keys.size()); + } + + @Test + public void givenAJsonNode_whenUsingFieldsMethod_thenWeGetAllFieldNames() { + List keys = GetAllKeysFromJSON.getAllKeysInJsonUsingJsonNodeFields(json, mapper); + assertEquals(13, keys.size()); + } + + @Test + public void givenAJsonNode_whenUsingJsonParserMethod_thenWeGetAllFieldNames() { + List keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonParser(json, mapper); + assertEquals(13, keys.size()); + + keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonParser(json); + assertEquals(13, keys.size()); + } + + @Test + public void givenAJsonNode_whenUsingMaps_thenWeGetAllFieldNames() { + List keys = GetAllKeysFromJSON.getKeysInJsonUsingMaps(json, mapper); + assertEquals(13, keys.size()); + } + +}