Skip to content

Commit eda9dd0

Browse files
authored
BAEL-5191-JsonNode-Get-All-Keys-From-A-Json-Structure (eugenp#11451)
* BAEL-5191-JsonNode-Get-All-Keys-From-A-Json-Structure * Added test cases for GetAllKeysFromJSON class methods * Updated test class name
1 parent d12fe37 commit eda9dd0

2 files changed

Lines changed: 228 additions & 0 deletions

File tree

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package com.baeldung.jackson.jsonnode;
2+
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Iterator;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.Map.Entry;
9+
10+
import com.fasterxml.jackson.core.JsonFactory;
11+
import com.fasterxml.jackson.core.JsonParser;
12+
import com.fasterxml.jackson.core.JsonProcessingException;
13+
import com.fasterxml.jackson.core.JsonToken;
14+
import com.fasterxml.jackson.core.type.TypeReference;
15+
import com.fasterxml.jackson.databind.JsonNode;
16+
import com.fasterxml.jackson.databind.ObjectMapper;
17+
import com.fasterxml.jackson.databind.node.ArrayNode;
18+
19+
public class GetAllKeysFromJSON {
20+
21+
public static List<String> getKeysInJsonUsingMaps(String json, ObjectMapper mapper) {
22+
List<String> keys = new ArrayList<>();
23+
24+
try {
25+
Map<String, Object> jsonElements = mapper.readValue(json, new TypeReference<Map<String, Object>>() {
26+
});
27+
getAllKeys(jsonElements, keys);
28+
return keys;
29+
30+
} catch (JsonProcessingException e) {
31+
e.printStackTrace();
32+
}
33+
34+
return keys;
35+
}
36+
37+
public static void getAllKeys(Map<String, Object> jsonElements, List<String> keys) {
38+
39+
jsonElements.entrySet()
40+
.forEach(entry -> {
41+
keys.add(entry.getKey());
42+
if (entry.getValue() instanceof Map) {
43+
Map<String, Object> map = (Map<String, Object>) entry.getValue();
44+
getAllKeys(map, keys);
45+
} else if (entry.getValue() instanceof List) {
46+
List<?> list = (List<?>) entry.getValue();
47+
list.forEach(listEntry -> {
48+
if (listEntry instanceof Map) {
49+
Map<String, Object> map = (Map<String, Object>) listEntry;
50+
getAllKeys(map, keys);
51+
}
52+
});
53+
}
54+
});
55+
}
56+
57+
public static List<String> getKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) {
58+
List<String> keys = new ArrayList<>();
59+
60+
try {
61+
JsonNode jsonNode = mapper.readTree(json);
62+
Iterator<String> iterator = jsonNode.fieldNames();
63+
iterator.forEachRemaining(e -> keys.add(e));
64+
65+
} catch (JsonProcessingException e) {
66+
e.printStackTrace();
67+
}
68+
return keys;
69+
}
70+
71+
public static List<String> getAllKeysInJsonUsingJsonNodeFieldNames(String json, ObjectMapper mapper) {
72+
List<String> keys = new ArrayList<>();
73+
74+
try {
75+
JsonNode jsonNode = mapper.readTree(json);
76+
getAllKeysUsingJsonNodeFieldNames(jsonNode, keys);
77+
78+
} catch (JsonProcessingException e) {
79+
e.printStackTrace();
80+
}
81+
return keys;
82+
}
83+
84+
public static List<String> getAllKeysInJsonUsingJsonNodeFields(String json, ObjectMapper mapper) {
85+
List<String> keys = new ArrayList<>();
86+
87+
try {
88+
JsonNode jsonNode = mapper.readTree(json);
89+
getAllKeysUsingJsonNodeFields(jsonNode, keys);
90+
91+
} catch (JsonProcessingException e) {
92+
e.printStackTrace();
93+
}
94+
return keys;
95+
}
96+
97+
public static void getAllKeysUsingJsonNodeFields(JsonNode jsonNode, List<String> keys) {
98+
99+
if (jsonNode.isObject()) {
100+
Iterator<Entry<String, JsonNode>> fields = jsonNode.fields();
101+
102+
fields.forEachRemaining(field -> {
103+
keys.add(field.getKey());
104+
getAllKeysUsingJsonNodeFieldNames((JsonNode) field.getValue(), keys);
105+
});
106+
} else if (jsonNode.isArray()) {
107+
ArrayNode arrayField = (ArrayNode) jsonNode;
108+
arrayField.forEach(node -> {
109+
getAllKeysUsingJsonNodeFieldNames(node, keys);
110+
});
111+
}
112+
113+
}
114+
115+
public static void getAllKeysUsingJsonNodeFieldNames(JsonNode jsonNode, List<String> keys) {
116+
117+
if (jsonNode.isObject()) {
118+
Iterator<String> fieldNames = jsonNode.fieldNames();
119+
120+
fieldNames.forEachRemaining(fieldName -> {
121+
keys.add(fieldName);
122+
getAllKeysUsingJsonNodeFieldNames(jsonNode.get(fieldName), keys);
123+
});
124+
} else if (jsonNode.isArray()) {
125+
ArrayNode arrayField = (ArrayNode) jsonNode;
126+
arrayField.forEach(node -> {
127+
getAllKeysUsingJsonNodeFieldNames(node, keys);
128+
});
129+
}
130+
131+
}
132+
133+
public static List<String> getKeysInJsonUsingJsonParser(String json, ObjectMapper mapper) {
134+
List<String> keys = new ArrayList<>();
135+
136+
try {
137+
JsonNode jsonNode = mapper.readTree(json);
138+
JsonParser jsonParser = jsonNode.traverse();
139+
while (!jsonParser.isClosed()) {
140+
if (jsonParser.nextToken() == JsonToken.FIELD_NAME) {
141+
keys.add((jsonParser.getCurrentName()));
142+
}
143+
}
144+
} catch (JsonProcessingException e) {
145+
e.printStackTrace();
146+
} catch (IOException e) {
147+
e.printStackTrace();
148+
}
149+
150+
return keys;
151+
}
152+
153+
public static List<String> getKeysInJsonUsingJsonParser(String json) {
154+
List<String> keys = new ArrayList<>();
155+
156+
try {
157+
JsonFactory factory = new JsonFactory();
158+
JsonParser jsonParser = factory.createParser(json);
159+
while (!jsonParser.isClosed()) {
160+
if (jsonParser.nextToken() == JsonToken.FIELD_NAME) {
161+
keys.add((jsonParser.getCurrentName()));
162+
}
163+
}
164+
} catch (JsonProcessingException e) {
165+
e.printStackTrace();
166+
} catch (IOException e) {
167+
e.printStackTrace();
168+
}
169+
170+
return keys;
171+
}
172+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.baeldung.jackson.jsonnode;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.util.List;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
11+
public class GetAllKeysFromJSONUnitTest {
12+
13+
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"
14+
+ " {\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"
15+
+ " \"Bread\":\"Whole wheat\",\r\n" + " \"Beverage\":\"Fruit juice\"\r\n" + " },\r\n" + " {\r\n" + " \"Sandwich\":\"Vegetable Sandwich\",\r\n" + " \"Beverage\":\"Coffee\"\r\n"
16+
+ " }\r\n" + " ]\r\n" + " }\r\n" + "}";
17+
18+
private static ObjectMapper mapper = new ObjectMapper();
19+
20+
// Top level keys : [Name, Age, BookInterests, FoodInterests]
21+
// All keys: [Name, Age, BookInterests, Book, Author, Book, Author, FoodInterests, Breakfast, Bread, Beverage, Sandwich, Beverage]
22+
23+
@Test
24+
public void givenAJsonNode_whenUsingFieldNamesMethod_thenWeGetTopFieldNames() {
25+
List<String> keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonNodeFieldNames(json, mapper);
26+
assertEquals(4, keys.size());
27+
}
28+
29+
@Test
30+
public void givenAJsonNode_whenUsingFieldNamesMethodForAllNodes_thenWeGetAllFieldNames() {
31+
List<String> keys = GetAllKeysFromJSON.getAllKeysInJsonUsingJsonNodeFieldNames(json, mapper);
32+
assertEquals(13, keys.size());
33+
}
34+
35+
@Test
36+
public void givenAJsonNode_whenUsingFieldsMethod_thenWeGetAllFieldNames() {
37+
List<String> keys = GetAllKeysFromJSON.getAllKeysInJsonUsingJsonNodeFields(json, mapper);
38+
assertEquals(13, keys.size());
39+
}
40+
41+
@Test
42+
public void givenAJsonNode_whenUsingJsonParserMethod_thenWeGetAllFieldNames() {
43+
List<String> keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonParser(json, mapper);
44+
assertEquals(13, keys.size());
45+
46+
keys = GetAllKeysFromJSON.getKeysInJsonUsingJsonParser(json);
47+
assertEquals(13, keys.size());
48+
}
49+
50+
@Test
51+
public void givenAJsonNode_whenUsingMaps_thenWeGetAllFieldNames() {
52+
List<String> keys = GetAllKeysFromJSON.getKeysInJsonUsingMaps(json, mapper);
53+
assertEquals(13, keys.size());
54+
}
55+
56+
}

0 commit comments

Comments
 (0)