From ade4f1470280f656b36dcbf0f7f1376ae0283697 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 23 Aug 2014 11:00:20 +0300 Subject: [PATCH] further gson testing work --- gson/README.md | 8 +- gson/pom.xml | 6 +- .../deserialization/GenericSourceClass.java | 10 -- .../deserialization/GenericTargetClass.java | 18 ++++ .../gson/deserialization/SourceClass.java | 32 ++++++ .../SourceClassDeserializer.java | 25 +++++ .../gson/deserialization/TargetClass.java | 19 ++++ .../TargetClassDeserializer.java | 21 ++++ .../test/GsonDeserializationTest.java | 98 +++++++++++++++++++ .../test/GsonDeserializationUnitTest.java | 33 ------- 10 files changed, 217 insertions(+), 53 deletions(-) delete mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/GenericSourceClass.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/SourceClassDeserializer.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/TargetClass.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/TargetClassDeserializer.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationTest.java delete mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationUnitTest.java 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); - } - -}