Skip to content

Commit

Permalink
BAEL-6692 - converting json to map and comparing (eugenp#14630)
Browse files Browse the repository at this point in the history
* BAEL-6692 - converting json to map and comparing

* BAEL-6692 - converting json to map and comparing

* BAEL-6692 - converting json to map and comparing
  • Loading branch information
abh1navv authored Aug 30, 2023
1 parent cdf8439 commit 05ca686
Show file tree
Hide file tree
Showing 6 changed files with 146 additions and 0 deletions.
6 changes: 6 additions & 0 deletions json-modules/json-conversion/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,17 @@
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
</dependencies>

<properties>
<json.version>20211205</json.version>
<gson.version>2.10.1</gson.version>
<guava.version>32.1.2-jre</guava.version>
</properties>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.baeldung.jsontomap;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FlattenUtils {
public static Map<String, Object> flatten(Map<String, Object> map) {
return flatten(map, null);
}

private static Map<String, Object> flatten(Map<String, Object> map, String prefix) {
Map<String, Object> flatMap = new HashMap<>();
map.forEach((key, value) -> {
String newKey = prefix != null ? prefix + "." + key : key;
if (value instanceof Map) {
flatMap.putAll(flatten((Map<String, Object>) value, newKey));
} else if (value instanceof List) {
// check for list of primitives
Object element = ((List<?>) value).get(0);
if (element instanceof String || element instanceof Number || element instanceof Boolean) {
flatMap.put(newKey, value);
} else {
// check for list of objects
List<Map<String, Object>> list = (List<Map<String, Object>>) value;
for (int i = 0; i < list.size(); i++) {
flatMap.putAll(flatten(list.get(i), newKey + "[" + i + "]"));
}
}
} else {
flatMap.put(newKey, value);
}
});
return flatMap;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.baeldung.jsontomap;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map;

public class JsonUtils {
public static Map<String, Object> jsonFileToMap(String path) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(new File(path), new TypeReference<Map<String, Object>>() {});
}

public static Map<String, Object> jsonFileToMapGson(String path) throws IOException {
Gson gson = new Gson();
return gson.fromJson(new FileReader(path), new TypeToken<Map<String, Object>>() {}.getType());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.baeldung.jsontomap;

import com.google.common.collect.MapDifference;
import com.google.common.collect.Maps;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

public class JSONComparisonUnitTest {

@Test
void givenTwoJsonFiles_whenCompared_thenTheyAreDifferent() throws IOException {
Map<String, Object> firstMap = JsonUtils.jsonFileToMap("src/test/resources/first.json");
Map<String, Object> secondMap = JsonUtils.jsonFileToMap("src/test/resources/second.json");

MapDifference<String, Object> difference = Maps.difference(firstMap, secondMap);
difference.entriesDiffering().forEach((key, value) -> {
System.out.println(key + ": " + value.leftValue() + " - " + value.rightValue());
});
assertThat(difference.areEqual()).isFalse();
}

@Test
void givenTwoJsonFiles_whenFlattenedAndCompared_thenTheyAreDifferent() throws IOException {
Map<String, Object> firstFlatMap = FlattenUtils.flatten(JsonUtils.jsonFileToMap("src/test/resources/first.json"));
Map<String, Object> secondFlatMap = FlattenUtils.flatten(JsonUtils.jsonFileToMap("src/test/resources/second.json"));

MapDifference<String, Object> difference = Maps.difference(firstFlatMap, secondFlatMap);
difference.entriesDiffering().forEach((key, value) -> {
System.out.println(key + ": " + value.leftValue() + " - " + value.rightValue());
});
assertThat(difference.areEqual()).isFalse();
}
}
22 changes: 22 additions & 0 deletions json-modules/json-conversion/src/test/resources/first.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "John",
"age": 30,
"cars": [
"Ford",
"BMW"
],
"address": {
"street": "Second Street",
"city": "New York"
},
"children": [
{
"name": "Sara",
"age": 5
},
{
"name": "Alex",
"age": 3
}
]
}
22 changes: 22 additions & 0 deletions json-modules/json-conversion/src/test/resources/second.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "John",
"age": 30,
"cars": [
"Ford",
"Audi"
],
"address": {
"street": "Main Street",
"city": "New York"
},
"children": [
{
"name": "Peter",
"age": 5
},
{
"name": "Cathy",
"age": 10
}
]
}

0 comments on commit 05ca686

Please sign in to comment.