diff --git a/gson/README.md b/gson/README.md
index 539cb34761..559e536d81 100644
--- a/gson/README.md
+++ b/gson/README.md
@@ -1,12 +1,6 @@
=========
-## Jackson Cookbooks and Examples
+## GSON Cookbooks and Examples
### Relevant Articles:
-- [Jackson Ignore Properties on Marshalling](http://www.baeldung.com/jackson-ignore-properties-on-serialization)
-- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
-- [Jackson Unmarshalling json with Unknown Properties](http://www.baeldung.com/jackson-deserialize-json-unknown-properties)
-- [Jackson – Custom Serializer](http://www.baeldung.com/jackson-custom-serialization)
-- [Jackson – Custom Deserializer](http://www.baeldung.com/jackson-deserialization)
-
diff --git a/gson/pom.xml b/gson/pom.xml
index 2a28f4fb36..6b93c0c1f5 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -41,7 +41,7 @@
com.google.code.gson
gson
- 2.3
+ ${gson.version}
@@ -76,7 +76,7 @@
- jackson
+ gson
src/main/resources
@@ -116,7 +116,7 @@
5.1.31
- 2.4.1
+ 2.3
1.7.7
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/GenericSourceClass.java b/gson/src/test/java/org/baeldung/gson/deserialization/GenericSourceClass.java
deleted file mode 100644
index 590203e622..0000000000
--- a/gson/src/test/java/org/baeldung/gson/deserialization/GenericSourceClass.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.baeldung.gson.deserialization;
-
-public class GenericSourceClass {
- int intField;
-
- public GenericSourceClass(final int i) {
- intField = i;
- }
-
-}
\ No newline at end of file
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java b/gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java
new file mode 100644
index 0000000000..9ff569f9e3
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java
@@ -0,0 +1,18 @@
+package org.baeldung.gson.deserialization;
+
+public class GenericTargetClass {
+
+ public INTEGER intField;
+
+ GenericTargetClass(final INTEGER value) {
+ intField = value;
+ }
+
+ //
+
+ @Override
+ public String toString() {
+ return "GenericTargetClass{" + "intField=" + intField + '}';
+ }
+
+}
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java b/gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java
new file mode 100644
index 0000000000..5561a15500
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java
@@ -0,0 +1,32 @@
+package org.baeldung.gson.deserialization;
+
+public class SourceClass {
+ int intValue;
+ String stringValue;
+
+ public SourceClass(int intValue, String stringValue) {
+ this.intValue = intValue;
+ this.stringValue = stringValue;
+ }
+
+ @Override
+ public String toString() {
+ return "SourceClass{" +
+ "intValue=" + intValue +
+ ", stringValue='" + stringValue + '\'' +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SourceClass)) return false;
+
+ SourceClass that = (SourceClass) o;
+
+ if (intValue != that.intValue) return false;
+ if (!stringValue.equals(that.stringValue)) return false;
+
+ return true;
+ }
+}
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/SourceClassDeserializer.java b/gson/src/test/java/org/baeldung/gson/deserialization/SourceClassDeserializer.java
new file mode 100644
index 0000000000..1d82acabf8
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/deserialization/SourceClassDeserializer.java
@@ -0,0 +1,25 @@
+package org.baeldung.gson.deserialization;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+
+import java.lang.reflect.Type;
+
+public class SourceClassDeserializer implements JsonDeserializer {
+
+ @Override
+ public SourceClass[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ JsonArray jArray = json.getAsJsonArray();
+ SourceClass[] scArray = new SourceClass[jArray.size()];
+ int index = 0;
+ for (JsonElement jElement : jArray) {
+ int i = jElement.getAsJsonObject().get("intValue").getAsInt();
+ String s = jElement.getAsJsonObject().get("stringValue").getAsString();
+ scArray[index++] = new SourceClass(i, s);
+ }
+ return scArray;
+ }
+}
\ No newline at end of file
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/TargetClass.java b/gson/src/test/java/org/baeldung/gson/deserialization/TargetClass.java
new file mode 100644
index 0000000000..8181f2d9c2
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/deserialization/TargetClass.java
@@ -0,0 +1,19 @@
+package org.baeldung.gson.deserialization;
+
+public class TargetClass {
+ public int intValue;
+ public String stringValue;
+
+ public TargetClass(final int intValue, final String stringValue) {
+ this.intValue = intValue;
+ this.stringValue = stringValue;
+ }
+
+ // API
+
+ @Override
+ public String toString() {
+ return "TargetClass{" + "intValue= " + intValue + ", stringValue= " + stringValue + '}';
+ }
+
+}
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/TargetClassDeserializer.java b/gson/src/test/java/org/baeldung/gson/deserialization/TargetClassDeserializer.java
new file mode 100644
index 0000000000..e19f7d3b82
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/deserialization/TargetClassDeserializer.java
@@ -0,0 +1,21 @@
+package org.baeldung.gson.deserialization;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParseException;
+
+import java.lang.reflect.Type;
+
+
+public class TargetClassDeserializer implements JsonDeserializer {
+
+ @Override
+ public TargetClass deserialize(JsonElement jElement, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ JsonObject jObject = jElement.getAsJsonObject();
+ int intValue = jObject.get("valueInt").getAsInt();
+ String stringValue = jObject.get("valueString").getAsString();
+ return new TargetClass(intValue, stringValue);
+ }
+}
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationTest.java b/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationTest.java
new file mode 100644
index 0000000000..3cb9639520
--- /dev/null
+++ b/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationTest.java
@@ -0,0 +1,98 @@
+package org.baeldung.gson.deserialization.test;
+
+import static org.hamcrest.Matchers.instanceOf;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.baeldung.gson.deserialization.GenericTargetClass;
+import org.baeldung.gson.deserialization.SourceClass;
+import org.baeldung.gson.deserialization.SourceClassDeserializer;
+import org.baeldung.gson.deserialization.TargetClass;
+import org.baeldung.gson.deserialization.TargetClassDeserializer;
+import org.junit.Test;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+
+public class GsonDeserializationTest {
+
+ @Test
+ public void givenJsonHasDissimilarFieldNamesButGsonMapsRight_whenUsingCustomDeserializer_thenCorrect() {
+ final String jsonSourceObject = "{\"valueInt\":7,\"valueString\":\"seven\"}";
+ final GsonBuilder gsonBldr = new GsonBuilder();
+ gsonBldr.registerTypeAdapter(TargetClass.class, new TargetClassDeserializer());
+ final Gson gson = gsonBldr.create();
+ final TargetClass targetObject = gson.fromJson(jsonSourceObject, TargetClass.class);
+
+ assertEquals(targetObject.intValue, 7);
+ assertEquals(targetObject.stringValue, "seven");
+ }
+
+ @Test
+ public void givenJsonWithArray_whenUsingGsonCustomDeserializer_thenMapsToArrayList() {
+ // It is necessary to override the equals() method in SourceClass
+ final String jsonSourceObject = "[{\"intValue\":1,\"stringValue\":\"one\"},{\"intValue\":2,\"stringValue\":\"two\"}]";
+ final GsonBuilder gsonBldr = new GsonBuilder();
+ gsonBldr.registerTypeHierarchyAdapter(SourceClass[].class, new SourceClassDeserializer());
+ final Gson gson = gsonBldr.create();
+
+ final List targetList = Arrays.asList(gson.fromJson(jsonSourceObject, SourceClass[].class));
+
+ assertEquals(new SourceClass(1, "one"), targetList.get(0));
+ }
+
+ @Test
+ public void givenJsonHasDissimilarFieldNamesButGsonMapsRight_whenDeserializingManualy_thenCorrect() {
+ final String jsonSourceObject = "{\"valueInt\":7,\"valueString\":\"seven\"}";
+ final JsonParser jParser = new JsonParser();
+ final JsonElement jElement = jParser.parse(jsonSourceObject);
+ final JsonObject jObject = jElement.getAsJsonObject();
+ final int intValue = jObject.get("valueInt").getAsInt();
+ final String stringValue = jObject.get("valueString").getAsString();
+
+ final TargetClass targetObject = new TargetClass(intValue, stringValue);
+
+ assertEquals(targetObject.intValue, 7);
+ assertEquals(targetObject.stringValue, "seven");
+ }
+
+ @Test
+ public void givenJsonHasExtraValuesButGsonIsIgnoringExtras_whenDeserializing_thenCorrect() {
+ final String serializedSourceObject = "{\"intValue\":1,\"stringValue\":\"one\",\"extraString\":\"two\",\"extraFloat\":2.2}";
+ final TargetClass targetObject = new Gson().fromJson(serializedSourceObject, TargetClass.class);
+
+ assertEquals(targetObject.intValue, 1);
+ assertEquals(targetObject.stringValue, "one");
+ }
+
+ @Test
+ public void givenUsingGson_whenDeserializingGeneric_thenCorrect() {
+ final Type genericTargetClassType = new TypeToken>() {
+ }.getType();
+ final String serializedSourceObject = "{\"intField\":1}";
+
+ final GenericTargetClass targetObject = new Gson().fromJson(serializedSourceObject, genericTargetClassType);
+
+ assertEquals(targetObject.intField, new Integer(1));
+ }
+
+ @Test
+ public void givenUsingGson_whenDeserializingCollection_thenCorrect() {
+ final String serializedSourceCollection = "[{\"intValue\":1,\"stringValue\":\"one\"},{\"intValue\":2,\"stringValue\":\"two\"}]";
+ final Type targetClassType = new TypeToken>() {
+ }.getType();
+
+ final Collection targetCollection = new Gson().fromJson(serializedSourceCollection, targetClassType);
+ assertThat(targetCollection, instanceOf(ArrayList.class));
+ }
+}
diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java b/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java
deleted file mode 100644
index 583aa16ff7..0000000000
--- a/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.baeldung.gson.deserialization.test;
-
-import org.baeldung.gson.deserialization.GenericSourceClass;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-
-public class GsonDeserializationUnitTest {
-
- private Gson gson;
-
- @Before
- public final void before() {
- gson = new Gson();
- }
-
- // tests
-
- @Test
- public void givenUsingGson_whenDeserializingGeneric_thenCorrect() {
- final java.lang.reflect.Type genericSourceClassType = new TypeToken() {
- }.getType();
- final GenericSourceClass sourceObject = new GenericSourceClass(1);
- final String serializedSourceObject = gson.toJson(sourceObject, genericSourceClassType);
-
- final GenericSourceClass targetObject = gson.fromJson(serializedSourceObject, genericSourceClassType);
-
- System.out.println(targetObject);
- }
-
-}