diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index a0c555c88d..c72b3a0675 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -80,11 +80,13 @@ * MyType target2 = gson.fromJson(json, MyType.class); // deserializes json into target2 * * - *
If the object that your are serializing/deserializing is a {@code ParameterizedType} - * (i.e. contains at least one type parameter and may be an array) then you must use the - * {@link #toJson(Object, Type)} or {@link #fromJson(String, TypeToken)} method. Gson provides - * the {@link TypeToken} class which helps you with this. Here is an example showing how - * this can be done: + *
If the type of the object that you are converting is a {@code ParameterizedType}
+ * (i.e. has at least one type argument, for example {@code List For example, to create a type literal for {@code List
* {@code TypeToken If the type arguments of the parameterized type are only available at
+ * runtime, for example when you want to create a {@code List
* TypeToken<List<MyType>> listType = new TypeToken<List<MyType>>() {};
* List<MyType> target = new LinkedList<MyType>();
@@ -92,7 +94,7 @@
*
* Gson gson = new Gson();
* // For serialization you normally do not have to specify the type, Gson will use
- * // the runtime class of the objects, however you can also specify it explicitly
+ * // the runtime type of the objects, however you can also specify it explicitly
* String json = gson.toJson(target, listType.getType());
*
* // But for deserialization you have to specify the type
diff --git a/gson/src/main/java/com/google/gson/reflect/TypeToken.java b/gson/src/main/java/com/google/gson/reflect/TypeToken.java
index 547e5f5b5f..39e81f33f9 100644
--- a/gson/src/main/java/com/google/gson/reflect/TypeToken.java
+++ b/gson/src/main/java/com/google/gson/reflect/TypeToken.java
@@ -32,7 +32,7 @@
* runtime.
*
*
> list = new TypeToken
>() {};}
@@ -43,6 +43,11 @@
* might expect, which gives a false sense of type-safety at compilation time
* and can lead to an unexpected {@code ClassCastException} at runtime.
*
+ *
{@code
+ * Class
+ * As seen here the result is a {@code TypeToken>}; this method cannot provide any type safety,
+ * and care must be taken to pass in the correct number of type arguments.
*
* @throws IllegalArgumentException
* If {@code rawType} is not of type {@code Class}, or if the type arguments are invalid for
diff --git a/gson/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java b/gson/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java
index 49cb0db9bc..e616874620 100644
--- a/gson/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java
+++ b/gson/src/test/java/com/google/gson/functional/ParameterizedTypesTest.java
@@ -16,13 +16,19 @@
package com.google.gson.functional;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
import com.google.gson.ParameterizedTypeFixtures.MyParameterizedType;
import com.google.gson.ParameterizedTypeFixtures.MyParameterizedTypeAdapter;
import com.google.gson.ParameterizedTypeFixtures.MyParameterizedTypeInstanceCreator;
import com.google.gson.common.TestTypes.BagOfPrimitives;
import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
@@ -32,7 +38,8 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Test;
/**
* Functional tests for the serialization and deserialization of parameterized types in Gson.
@@ -40,15 +47,15 @@
* @author Inderjeet Singh
* @author Joel Leitch
*/
-public class ParameterizedTypesTest extends TestCase {
+public class ParameterizedTypesTest {
private Gson gson;
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ public void setUp() {
gson = new Gson();
}
+ @Test
public void testParameterizedTypesSerialization() throws Exception {
MyParameterizedType
int value = 30;
}
+ @Test
public void testDeepParameterizedTypeSerialization() {
Amount
> typeToken = new TypeToken
>() {};
+ Type type = typeToken.getType();
+
+ {
+ JsonObject jsonObject = new JsonObject();
+ jsonObject.addProperty("q", 4);
+ JsonArray jsonArray = new JsonArray();
+ jsonArray.add(jsonObject);
+
+ assertCorrectlyDeserialized(gson.fromJson(jsonArray, typeToken));
+ assertCorrectlyDeserialized(gson.fromJson(jsonArray, type));
+ }
+
+ String json = "[{\"q\":4}]";
+
+ {
+ assertCorrectlyDeserialized(gson.fromJson(json, typeToken));
+ assertCorrectlyDeserialized(gson.fromJson(json, type));
+ }
+
+ {
+ assertCorrectlyDeserialized(gson.fromJson(new StringReader(json), typeToken));
+ assertCorrectlyDeserialized(gson.fromJson(new StringReader(json), type));
+ }
+
+ {
+ JsonReader reader = new JsonReader(new StringReader(json));
+ assertCorrectlyDeserialized(gson.fromJson(reader, typeToken));
+
+ reader = new JsonReader(new StringReader(json));
+ assertCorrectlyDeserialized(gson.fromJson(reader, type));
+ }
+ }
}