From 586e911a026956a2910def60dadd8b4ee2d44537 Mon Sep 17 00:00:00 2001 From: Swapan Pramanick Date: Wed, 31 Oct 2018 18:47:17 +0530 Subject: [PATCH] BAEL-2176 (#5441) * Evaluation Article - Spring web-flux * Evaluation Article - Spring web-flux * Evaluation Article - Spring web-flux * Evaluation Article - Spring web-flux * core-scala: initial commit * adding core-scala to pom * Revert "core-scala: initial commit" This reverts commit d46873405a67addfaa69aa7855b37af9c4a3df14. * BAEL-2176 * inserting new lines between given, when and then parts * Formatted using formatter * indentation changed further * Suggested changes in coding * Adding Date Deserializer * BAEL-2176: Switching to functional paradigm * BAEL-2176 * BAEL-2176: changing HashMap to Map * BAEL-2176: changed exception type * BAEL-2176 --- ...Deserializer.java => MapDeserializer.java} | 26 +++++----- .../StringDateMapDeserializer.java | 44 ++++++++++++++++ ...t.java => MapDeserializationUnitTest.java} | 50 ++++++++++++++----- 3 files changed, 94 insertions(+), 26 deletions(-) rename gson/src/main/java/org/baeldung/gson/serialization/{HashMapDeserializer.java => MapDeserializer.java} (62%) create mode 100644 gson/src/main/java/org/baeldung/gson/serialization/StringDateMapDeserializer.java rename gson/src/test/java/org/baeldung/gson/deserialization/{HashMapDeserializationUnitTest.java => MapDeserializationUnitTest.java} (58%) diff --git a/gson/src/main/java/org/baeldung/gson/serialization/HashMapDeserializer.java b/gson/src/main/java/org/baeldung/gson/serialization/MapDeserializer.java similarity index 62% rename from gson/src/main/java/org/baeldung/gson/serialization/HashMapDeserializer.java rename to gson/src/main/java/org/baeldung/gson/serialization/MapDeserializer.java index bb73e32559..cdeb2e23c8 100644 --- a/gson/src/main/java/org/baeldung/gson/serialization/HashMapDeserializer.java +++ b/gson/src/main/java/org/baeldung/gson/serialization/MapDeserializer.java @@ -4,28 +4,26 @@ import java.lang.reflect.Type; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; import org.baeldung.gson.entities.Employee; import com.google.gson.*; -public class HashMapDeserializer implements JsonDeserializer> { +public class MapDeserializer implements JsonDeserializer> { @Override - public HashMap deserialize(JsonElement elem, Type type, JsonDeserializationContext context) throws JsonParseException { - HashMap map = new HashMap<>(); - for (Map.Entry entry : elem.getAsJsonObject().entrySet()) { - JsonElement jsonValue = entry.getValue(); - Object value = null; - if (jsonValue.isJsonPrimitive()) { - value = toPrimitive(jsonValue.getAsJsonPrimitive(), context); - } else { - value = context.deserialize(jsonValue, Employee.class); - } - map.put(entry.getKey(), value); - } - return map; + public Map deserialize(JsonElement elem, Type type, JsonDeserializationContext context) throws JsonParseException { + return elem.getAsJsonObject() + .entrySet() + .stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + e -> e.getValue().isJsonPrimitive() ? + toPrimitive(e.getValue().getAsJsonPrimitive(), context) + : context.deserialize(e.getValue(), Employee.class) + )); } private Object toPrimitive(JsonPrimitive jsonValue, JsonDeserializationContext context) { diff --git a/gson/src/main/java/org/baeldung/gson/serialization/StringDateMapDeserializer.java b/gson/src/main/java/org/baeldung/gson/serialization/StringDateMapDeserializer.java new file mode 100644 index 0000000000..f18bdbc84f --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/serialization/StringDateMapDeserializer.java @@ -0,0 +1,44 @@ +package org.baeldung.gson.serialization; + +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +public class StringDateMapDeserializer implements JsonDeserializer> { + + private static final Logger logger = LoggerFactory.getLogger(StringDateMapDeserializer.class); + + private SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd"); + + @Override + public Map deserialize(JsonElement elem, Type type, JsonDeserializationContext jsonDeserializationContext) { + System.out.println("Deserializer called"); + logger.info("Deserializer called"); + return elem.getAsJsonObject() + .entrySet() + .stream() + .filter(e -> e.getValue().isJsonPrimitive()) + .filter(e -> e.getValue().getAsJsonPrimitive().isString()) + .collect(Collectors.toMap(Map.Entry::getKey, e -> formatDate(e.getValue()))); + } + + private Date formatDate(JsonElement value) { + try { + return format.parse(value.getAsString()); + } catch (ParseException ex) { + throw new JsonParseException(ex); + } + } + +} diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/HashMapDeserializationUnitTest.java b/gson/src/test/java/org/baeldung/gson/deserialization/MapDeserializationUnitTest.java similarity index 58% rename from gson/src/test/java/org/baeldung/gson/deserialization/HashMapDeserializationUnitTest.java rename to gson/src/test/java/org/baeldung/gson/deserialization/MapDeserializationUnitTest.java index 6905ade0da..a5ae4194e8 100644 --- a/gson/src/test/java/org/baeldung/gson/deserialization/HashMapDeserializationUnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/deserialization/MapDeserializationUnitTest.java @@ -1,10 +1,14 @@ package org.baeldung.gson.deserialization; import java.lang.reflect.Type; -import java.util.HashMap; +import java.text.ParseException; +import java.util.Date; +import java.util.Map; +import org.apache.commons.lang3.time.DateUtils; import org.baeldung.gson.entities.Employee; -import org.baeldung.gson.serialization.HashMapDeserializer; +import org.baeldung.gson.serialization.MapDeserializer; +import org.baeldung.gson.serialization.StringDateMapDeserializer; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; @@ -16,18 +20,18 @@ import com.google.gson.JsonSyntaxException; import com.google.gson.internal.LinkedTreeMap; import com.google.gson.reflect.TypeToken; -public class HashMapDeserializationUnitTest { +public class MapDeserializationUnitTest { - private static final Logger logger = LoggerFactory.getLogger(HashMapDeserializationUnitTest.class); + private static final Logger logger = LoggerFactory.getLogger(MapDeserializationUnitTest.class); @Test - public void whenUsingHashMapClass_thenShouldReturnMapWithDefaultClasses() { + public void whenUsingMapClass_thenShouldReturnMapWithDefaultClasses() { String jsonString = "{'employee.name':'Bob','employee.salary':10000, 'employee.active':true, " + "'employee':{'id':10, 'name': 'Bob Willis', 'address':'London'}}"; Gson gson = new Gson(); - HashMap map = gson.fromJson(jsonString, HashMap.class); + Map map = gson.fromJson(jsonString, Map.class); logger.info("The converted map: {}", map); Assert.assertEquals(4, map.size()); @@ -43,7 +47,7 @@ public class HashMapDeserializationUnitTest { + "'employee.active':true, " + "'employee':{'id':10, 'name': 'Bob Willis', 'address':'London'}}"; Gson gson = new Gson(); - HashMap map = gson.fromJson(jsonString, HashMap.class); + Map map = gson.fromJson(jsonString, Map.class); logger.info("The converted map: {}", map); } @@ -56,8 +60,8 @@ public class HashMapDeserializationUnitTest { + "'Steve':{'id':10, 'name': 'Steven Waugh', 'address':'Australia'}}"; Gson gson = new Gson(); - Type empMapType = new TypeToken>(){}.getType(); - HashMap nameEmployeeMap = gson.fromJson(jsonString, empMapType); + Type empMapType = new TypeToken>(){}.getType(); + Map nameEmployeeMap = gson.fromJson(jsonString, empMapType); logger.info("The converted map: {}", nameEmployeeMap); Assert.assertEquals(3, nameEmployeeMap.size()); @@ -70,11 +74,11 @@ public class HashMapDeserializationUnitTest { String jsonString = "{'employee.name':'Bob','employee.salary':10000, 'employee.active':true, " + "'employee':{'id':10, 'name': 'Bob Willis', 'address':'London'}}"; - Type type = new TypeToken>(){}.getType(); + Type type = new TypeToken>(){}.getType(); Gson gson = new GsonBuilder() - .registerTypeAdapter(type, new HashMapDeserializer()) + .registerTypeAdapter(type, new MapDeserializer()) .create(); - HashMap blendedMap = gson.fromJson(jsonString, type); + Map blendedMap = gson.fromJson(jsonString, type); logger.info("The converted map: {}", blendedMap); Assert.assertEquals(4, blendedMap.size()); @@ -83,4 +87,26 @@ public class HashMapDeserializationUnitTest { } + @Test + public void whenUsingCustomDateDeserializer_thenShouldReturnMapWithDate() { + String jsonString = "{'Bob': '2017/06/01', 'Jennie':'2015/01/03'}"; + Type type = new TypeToken>(){}.getType(); + Gson gson = new GsonBuilder() + .registerTypeAdapter(type, new StringDateMapDeserializer()) + .create(); + Map empJoiningDateMap = gson.fromJson(jsonString, type); + + logger.info("The converted map: {}", empJoiningDateMap); + logger.info("The map class {}", empJoiningDateMap.getClass()); + Assert.assertEquals(2, empJoiningDateMap.size()); + Assert.assertEquals(Date.class, empJoiningDateMap.get("Bob").getClass()); + Date dt = null; + try { + dt = DateUtils.parseDate("2017-06-01", "yyyy-MM-dd"); + Assert.assertEquals(dt, empJoiningDateMap.get("Bob")); + } catch (ParseException e) { + logger.error("Could not parse date", e); + } + } + }