Bael 5191 json node get all keys (#11486)

* BAEL-5191-JsonNode-Get-All-Keys-From-A-Json-Structure

* Added test cases for GetAllKeysFromJSON class methods

* Updated test class name

* BAEL - 5191 - Updated exception handling
This commit is contained in:
priya-soni 2021-11-21 21:56:38 +05:30 committed by GitHub
parent 156dc8cb2c
commit 4ae595210c
2 changed files with 77 additions and 85 deletions

View File

@ -8,33 +8,27 @@ import java.util.Map;
import java.util.Map.Entry;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
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.JsonMappingException;
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<String> getKeysInJsonUsingMaps(String json, ObjectMapper mapper) {
public List<String> getKeysInJsonUsingMaps(String json, ObjectMapper mapper) throws JsonMappingException, JsonProcessingException {
List<String> keys = new ArrayList<>();
try {
Map<String, Object> jsonElements = mapper.readValue(json, new TypeReference<Map<String, Object>>() {
});
getAllKeys(jsonElements, keys);
return keys;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
Map<String, Object> jsonElements = mapper.readValue(json, new TypeReference<Map<String, Object>>() {
});
getAllKeys(jsonElements, keys);
return keys;
}
public static void getAllKeys(Map<String, Object> jsonElements, List<String> keys) {
private void getAllKeys(Map<String, Object> jsonElements, List<String> keys) {
jsonElements.entrySet()
.forEach(entry -> {
@ -54,51 +48,35 @@ public class GetAllKeysFromJSON {
});
}
public static List<String> getKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) {
public List<String> getKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) throws JsonMappingException, JsonProcessingException {
List<String> keys = new ArrayList<>();
try {
JsonNode jsonNode = mapper.readTree(json);
Iterator<String> iterator = jsonNode.fieldNames();
iterator.forEachRemaining(e -> keys.add(e));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
JsonNode jsonNode = mapper.readTree(json);
Iterator<String> iterator = jsonNode.fieldNames();
iterator.forEachRemaining(e -> keys.add(e));
return keys;
}
public static List<String> getAllKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) {
public List<String> getAllKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) throws JsonMappingException, JsonProcessingException {
List<String> keys = new ArrayList<>();
try {
JsonNode jsonNode = mapper.readTree(json);
getAllKeysUsingJsonNodeFieldNames(jsonNode, keys);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
JsonNode jsonNode = mapper.readTree(json);
getAllKeysUsingJsonNodeFieldNames(jsonNode, keys);
return keys;
}
public static List<String> getAllKeysInJsonUsingJsonNodeFields(String json, ObjectMapper mapper) {
public List<String> getAllKeysInJsonUsingJsonNodeFields(String json, ObjectMapper mapper) throws JsonMappingException, JsonProcessingException {
List<String> keys = new ArrayList<>();
try {
JsonNode jsonNode = mapper.readTree(json);
getAllKeysUsingJsonNodeFields(jsonNode, keys);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
JsonNode jsonNode = mapper.readTree(json);
getAllKeysUsingJsonNodeFields(jsonNode, keys);
return keys;
}
public static void getAllKeysUsingJsonNodeFields(JsonNode jsonNode, List<String> keys) {
private void getAllKeysUsingJsonNodeFields(JsonNode jsonNode, List<String> keys) {
if (jsonNode.isObject()) {
Iterator<Entry<String, JsonNode>> fields = jsonNode.fields();
fields.forEachRemaining(field -> {
keys.add(field.getKey());
getAllKeysUsingJsonNodeFieldNames((JsonNode) field.getValue(), keys);
@ -112,11 +90,10 @@ public class GetAllKeysFromJSON {
}
public static void getAllKeysUsingJsonNodeFieldNames(JsonNode jsonNode, List<String> keys) {
private void getAllKeysUsingJsonNodeFieldNames(JsonNode jsonNode, List<String> keys) {
if (jsonNode.isObject()) {
Iterator<String> fieldNames = jsonNode.fieldNames();
fieldNames.forEachRemaining(fieldName -> {
keys.add(fieldName);
getAllKeysUsingJsonNodeFieldNames(jsonNode.get(fieldName), keys);
@ -130,43 +107,29 @@ public class GetAllKeysFromJSON {
}
public static List<String> getKeysInJsonUsingJsonParser(String json, ObjectMapper mapper) {
public List<String> getKeysInJsonUsingJsonParser(String json, ObjectMapper mapper) throws IOException {
List<String> 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()));
}
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<String> getKeysInJsonUsingJsonParser(String json) {
public List<String> getKeysInJsonUsingJsonParser(String json) throws JsonParseException, IOException {
List<String> 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()));
}
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;
}
}

View File

@ -2,10 +2,12 @@ package com.baeldung.jackson.jsonnode;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.IOException;
import java.util.List;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class GetAllKeysFromJSONUnitTest {
@ -16,41 +18,68 @@ public class GetAllKeysFromJSONUnitTest {
+ " }\r\n" + " ]\r\n" + " }\r\n" + "}";
private static ObjectMapper mapper = new ObjectMapper();
private static GetAllKeysFromJSON getAllKeysFromJSONUtil = new GetAllKeysFromJSON();
// 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<String> keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonNodeFieldNames(json, mapper);
assertEquals(4, keys.size());
List<String> keys;
try {
keys = getAllKeysFromJSONUtil.getKeysInJsonUsingJsonNodeFieldNames(json, mapper);
assertEquals(4, keys.size());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Test
public void givenAJsonNode_whenUsingFieldNamesMethodForAllNodes_thenWeGetAllFieldNames() {
List<String> keys = GetAllKeysFromJSON.getAllKeysInJsonUsingJsonNodeFieldNames(json, mapper);
assertEquals(13, keys.size());
List<String> keys;
try {
keys = getAllKeysFromJSONUtil.getAllKeysInJsonUsingJsonNodeFieldNames(json, mapper);
assertEquals(13, keys.size());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Test
public void givenAJsonNode_whenUsingFieldsMethod_thenWeGetAllFieldNames() {
List<String> keys = GetAllKeysFromJSON.getAllKeysInJsonUsingJsonNodeFields(json, mapper);
assertEquals(13, keys.size());
List<String> keys;
try {
keys = getAllKeysFromJSONUtil.getAllKeysInJsonUsingJsonNodeFields(json, mapper);
assertEquals(13, keys.size());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
@Test
public void givenAJsonNode_whenUsingJsonParserMethod_thenWeGetAllFieldNames() {
List<String> keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonParser(json, mapper);
assertEquals(13, keys.size());
List<String> keys;
try {
keys = getAllKeysFromJSONUtil.getKeysInJsonUsingJsonParser(json, mapper);
assertEquals(13, keys.size());
keys = getAllKeysFromJSONUtil.getKeysInJsonUsingJsonParser(json);
assertEquals(13, keys.size());
} catch (IOException e) {
e.printStackTrace();
}
keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonParser(json);
assertEquals(13, keys.size());
}
@Test
public void givenAJsonNode_whenUsingMaps_thenWeGetAllFieldNames() {
List<String> keys = GetAllKeysFromJSON.getKeysInJsonUsingMaps(json, mapper);
assertEquals(13, keys.size());
List<String> keys;
try {
keys = getAllKeysFromJSONUtil.getKeysInJsonUsingMaps(json, mapper);
assertEquals(13, keys.size());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}