From 2e48d26ff571d2a01d9d0f79dbd14806cb97d309 Mon Sep 17 00:00:00 2001 From: eugenp Date: Sat, 23 Aug 2014 12:50:27 +0300 Subject: [PATCH] deserialization work --- gson/src/main/resources/example1.json | 12 --- gson/src/main/resources/example2.json | 10 -- .../baeldung/gson/deserialization/Foo.java | 47 ++++++++ .../gson/deserialization/FooDeserializer.java | 26 +++++ ...serializerFromJsonWithDifferentFields.java | 21 ++++ ...enericTargetClass.java => GenericFoo.java} | 4 +- .../gson/deserialization/SourceClass.java | 32 ------ .../SourceClassDeserializer.java | 25 ----- .../gson/deserialization/TargetClass.java | 19 ---- .../TargetClassDeserializer.java | 21 ---- .../test/GsonDeserializationTest.java | 101 +++++++++--------- 11 files changed, 149 insertions(+), 169 deletions(-) delete mode 100644 gson/src/main/resources/example1.json delete mode 100644 gson/src/main/resources/example2.json create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/Foo.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializer.java create mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializerFromJsonWithDifferentFields.java rename gson/src/test/java/org/baeldung/gson/deserialization/{GenericTargetClass.java => GenericFoo.java} (72%) delete mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java delete mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/SourceClassDeserializer.java delete mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/TargetClass.java delete mode 100644 gson/src/test/java/org/baeldung/gson/deserialization/TargetClassDeserializer.java diff --git a/gson/src/main/resources/example1.json b/gson/src/main/resources/example1.json deleted file mode 100644 index 46d2982cec..0000000000 --- a/gson/src/main/resources/example1.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "collection": [ - { - "name": "Test order1", - "detail": "ahk ks" - }, - { - "name": "Test order2", - "detail": "Fisteku" - } - ] -} \ No newline at end of file diff --git a/gson/src/main/resources/example2.json b/gson/src/main/resources/example2.json deleted file mode 100644 index f4433731e6..0000000000 --- a/gson/src/main/resources/example2.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "name": "Test order1", - "detail": "ahk ks" - }, - { - "name": "Test order2", - "detail": "Fisteku" - } -] \ No newline at end of file diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/Foo.java b/gson/src/test/java/org/baeldung/gson/deserialization/Foo.java new file mode 100644 index 0000000000..1663fd6fa6 --- /dev/null +++ b/gson/src/test/java/org/baeldung/gson/deserialization/Foo.java @@ -0,0 +1,47 @@ +package org.baeldung.gson.deserialization; + +public class Foo { + public int intValue; + public String stringValue; + + public Foo(final int intValue, final String stringValue) { + this.intValue = intValue; + this.stringValue = stringValue; + } + + // API + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + intValue; + result = prime * result + ((stringValue == null) ? 0 : stringValue.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (intValue != other.intValue) + return false; + if (stringValue == null) { + if (other.stringValue != null) + return false; + } else if (!stringValue.equals(other.stringValue)) + return false; + return true; + } + + @Override + public String toString() { + return "TargetClass{" + "intValue= " + intValue + ", stringValue= " + stringValue + '}'; + } + +} diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializer.java b/gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializer.java new file mode 100644 index 0000000000..17c1dfae19 --- /dev/null +++ b/gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializer.java @@ -0,0 +1,26 @@ +package org.baeldung.gson.deserialization; + +import java.lang.reflect.Type; + +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; + +public class FooDeserializer implements JsonDeserializer { + + @Override + public Foo[] deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { + final JsonArray jArray = json.getAsJsonArray(); + final Foo[] scArray = new Foo[jArray.size()]; + int index = 0; + for (final JsonElement jElement : jArray) { + final int i = jElement.getAsJsonObject().get("intValue").getAsInt(); + final String s = jElement.getAsJsonObject().get("stringValue").getAsString(); + scArray[index++] = new Foo(i, s); + } + return scArray; + } + +} \ No newline at end of file diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializerFromJsonWithDifferentFields.java b/gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializerFromJsonWithDifferentFields.java new file mode 100644 index 0000000000..d4eaa39ac5 --- /dev/null +++ b/gson/src/test/java/org/baeldung/gson/deserialization/FooDeserializerFromJsonWithDifferentFields.java @@ -0,0 +1,21 @@ +package org.baeldung.gson.deserialization; + +import java.lang.reflect.Type; + +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; + +public class FooDeserializerFromJsonWithDifferentFields implements JsonDeserializer { + + @Override + public Foo deserialize(final JsonElement jElement, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { + final JsonObject jObject = jElement.getAsJsonObject(); + final int intValue = jObject.get("valueInt").getAsInt(); + final String stringValue = jObject.get("valueString").getAsString(); + return new Foo(intValue, stringValue); + } + +} diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java b/gson/src/test/java/org/baeldung/gson/deserialization/GenericFoo.java similarity index 72% rename from gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java rename to gson/src/test/java/org/baeldung/gson/deserialization/GenericFoo.java index 9ff569f9e3..0ab4d18da2 100644 --- a/gson/src/test/java/org/baeldung/gson/deserialization/GenericTargetClass.java +++ b/gson/src/test/java/org/baeldung/gson/deserialization/GenericFoo.java @@ -1,10 +1,10 @@ package org.baeldung.gson.deserialization; -public class GenericTargetClass { +public class GenericFoo { public INTEGER intField; - GenericTargetClass(final INTEGER value) { + GenericFoo(final INTEGER value) { intField = value; } diff --git a/gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java b/gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java deleted file mode 100644 index 5561a15500..0000000000 --- a/gson/src/test/java/org/baeldung/gson/deserialization/SourceClass.java +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 1d82acabf8..0000000000 --- a/gson/src/test/java/org/baeldung/gson/deserialization/SourceClassDeserializer.java +++ /dev/null @@ -1,25 +0,0 @@ -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 deleted file mode 100644 index 8181f2d9c2..0000000000 --- a/gson/src/test/java/org/baeldung/gson/deserialization/TargetClass.java +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index e19f7d3b82..0000000000 --- a/gson/src/test/java/org/baeldung/gson/deserialization/TargetClassDeserializer.java +++ /dev/null @@ -1,21 +0,0 @@ -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 index 3cb9639520..3868790f96 100644 --- a/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationTest.java +++ b/gson/src/test/java/org/baeldung/gson/deserialization/test/GsonDeserializationTest.java @@ -1,6 +1,8 @@ package org.baeldung.gson.deserialization.test; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -10,11 +12,9 @@ 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.baeldung.gson.deserialization.Foo; +import org.baeldung.gson.deserialization.FooDeserializerFromJsonWithDifferentFields; +import org.baeldung.gson.deserialization.GenericFoo; import org.junit.Test; import com.google.gson.Gson; @@ -26,33 +26,67 @@ import com.google.gson.reflect.TypeToken; public class GsonDeserializationTest { + // tests - single element + @Test - public void givenJsonHasDissimilarFieldNamesButGsonMapsRight_whenUsingCustomDeserializer_thenCorrect() { + public final void givenJsonHasExtraValuesButGsonIsIgnoringExtras_whenDeserializing_thenCorrect() { + final String serializedSourceObject = "{\"intValue\":1,\"stringValue\":\"one\",\"extraString\":\"two\",\"extraFloat\":2.2}"; + final Foo targetObject = new Gson().fromJson(serializedSourceObject, Foo.class); + + assertEquals(targetObject.intValue, 1); + assertEquals(targetObject.stringValue, "one"); + } + + @Test + public final void givenJsonHasNonMatchingFieldNames_whenDeserializingWithCustomDeserializer_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); + gsonBldr.registerTypeAdapter(Foo.class, new FooDeserializerFromJsonWithDifferentFields()); + final Foo targetObject = gsonBldr.create().fromJson(jsonSourceObject, Foo.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 + public final void givenUsingGson_whenDeserializingGeneric_thenCorrect() { + final Type genericTargetClassType = new TypeToken>() { + }.getType(); + final String serializedSourceObject = "{\"intField\":1}"; + + final GenericFoo targetObject = new Gson().fromJson(serializedSourceObject, genericTargetClassType); + + assertEquals(targetObject.intField, new Integer(1)); + } + + // tests - multiple elements + + @Test + public final void givenJsonArrayOfFoos_whenDeserializingToList_thenCorrect() { 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 Foo[] objectsAsArray = new GsonBuilder().create().fromJson(jsonSourceObject, Foo[].class); + final List targetList = Arrays.asList(objectsAsArray); - final List targetList = Arrays.asList(gson.fromJson(jsonSourceObject, SourceClass[].class)); - - assertEquals(new SourceClass(1, "one"), targetList.get(0)); + assertThat(targetList, hasItem(new Foo(1, "one"))); + assertThat(targetList, hasItem(new Foo(2, "two"))); + assertThat(targetList, not(hasItem(new Foo(1, "two")))); } @Test - public void givenJsonHasDissimilarFieldNamesButGsonMapsRight_whenDeserializingManualy_thenCorrect() { + public final 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)); + } + + // + + @Test + public void whenDeserializingJsonIntoElements_thenCorrect() { final String jsonSourceObject = "{\"valueInt\":7,\"valueString\":\"seven\"}"; final JsonParser jParser = new JsonParser(); final JsonElement jElement = jParser.parse(jsonSourceObject); @@ -60,39 +94,10 @@ public class GsonDeserializationTest { final int intValue = jObject.get("valueInt").getAsInt(); final String stringValue = jObject.get("valueString").getAsString(); - final TargetClass targetObject = new TargetClass(intValue, stringValue); + final Foo targetObject = new Foo(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)); - } }