Skip to content

Commit

Permalink
further gson testing work
Browse files Browse the repository at this point in the history
  • Loading branch information
eugenp committed Aug 23, 2014
1 parent 01625ed commit ade4f14
Show file tree
Hide file tree
Showing 10 changed files with 217 additions and 53 deletions.
8 changes: 1 addition & 7 deletions gson/README.md
Original file line number Diff line number Diff line change
@@ -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)


6 changes: 3 additions & 3 deletions gson/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3</version>
<version>${gson.version}</version>
</dependency>

<!-- test scoped -->
Expand Down Expand Up @@ -76,7 +76,7 @@
</dependencies>

<build>
<finalName>jackson</finalName>
<finalName>gson</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
Expand Down Expand Up @@ -116,7 +116,7 @@
<mysql-connector-java.version>5.1.31</mysql-connector-java.version>

<!-- marshalling -->
<jackson.version>2.4.1</jackson.version>
<gson.version>2.3</gson.version>

<!-- logging -->
<org.slf4j.version>1.7.7</org.slf4j.version>
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.baeldung.gson.deserialization;

public class GenericTargetClass<INTEGER> {

public INTEGER intField;

GenericTargetClass(final INTEGER value) {
intField = value;
}

//

@Override
public String toString() {
return "GenericTargetClass{" + "intField=" + intField + '}';
}

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<SourceClass[]> {

@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;
}
}
Original file line number Diff line number Diff line change
@@ -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 + '}';
}

}
Original file line number Diff line number Diff line change
@@ -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<TargetClass> {

@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);
}
}
Original file line number Diff line number Diff line change
@@ -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<SourceClass> 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<GenericTargetClass<Integer>>() {
}.getType();
final String serializedSourceObject = "{\"intField\":1}";

final GenericTargetClass<Integer> 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<ArrayList<TargetClass>>() {
}.getType();

final Collection<TargetClass> targetCollection = new Gson().fromJson(serializedSourceCollection, targetClassType);
assertThat(targetCollection, instanceOf(ArrayList.class));
}
}

This file was deleted.

0 comments on commit ade4f14

Please sign in to comment.