Trouble with Gson serializing an ArrayList of POJO's

JavaJsonSerializationArraylistGson

Java Problem Overview


I had been planning on using simpleXML for my serialization needs, but figured I would try JSON out, to learn something new.

This is the code I am using to try and serialize an ArrayList of test POJO's using Gson 1.7.1.

Note: I removed the Reader/Writers for a String "s" to simplify the code.

package test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.google.gson.Gson;

public class TestGsonSerialDeserialList {
	public static void main(String[] args) throws IOException{
		Gson gson = new Gson();
		
		//Make Serial 
		String s;
		List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
		list.add(new TestObject());
		list.add(new TestObject());
		
	    s = gson.toJson(list, ArrayList.class);
	    System.out.println(s);
	    
	    //Eat Serial
	    List<TestObject> list2 = Collections.synchronizedList(gson.fromJson(s, ArrayList.class) );
	    System.out.println(list2.get(0) );
	    System.out.println(list2.get(1) );
	}
}

Here is the output I get:

[{"objectID":1,"i1":12345,"name":"abcdefg","s":["a","b","c"]},{"objectID":2,"i1":12345,"name":"abcdefg","s":["a","b","c"]}]
java.lang.Object@5c74c3aa
java.lang.Object@75d9fd51

To my newbie eyes this looks correct. Only, the DeSerialized list of objects contains basic Objects, rather then the TestObject's I serialized. Can anyone please explain to me what, if anything, I can do to make this work?

EDIT:

Corrected to test: Thanks to ColinD

package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class TestGsonSerialDeserialList {
	public static void main(String[] args) throws IOException{
		System.out.println("--- Serialize / Deserialize Started ---");
		String fileName = "json\\testList.json";
		
		Gson gson = new Gson();
		Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
		
		//Make Serial 
		Writer osWriter = new OutputStreamWriter( new FileOutputStream(fileName));
		List<TestObject> list = Collections.synchronizedList(new ArrayList<TestObject>() );
		list.add(new TestObject());
		list.add(new TestObject());
		list.add(new TestObject());
		list.add(new TestObject());
	    gson.toJson(list, osWriter);
	    osWriter.close();
	    
	    
	    //Eat Serial
	    Reader isReader = new InputStreamReader( new FileInputStream((fileName) ) );
	    List<TestObject> list2 = Collections.synchronizedList(
	    	(List<TestObject>)gson.fromJson(isReader, listOfTestObject) 
	    );
	    isReader.close();
	    System.out.println(list2.get(0) );
	    System.out.println(list2.get(1) );
	    System.out.println(list2.get(2) );
	    System.out.println(list2.get(3) );
	    System.out.println("--- Serialize / Deserialize Ended ---");
	}
}

output:

--- Serialize / Deserialize Started ---
ID#: 1, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@95c083
ID#: 2, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@6791d8c1
ID#: 3, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@182d9c06
ID#: 4, i1: 12345, name: abcdefg, s[]: [Ljava.lang.String;@5a5e5a50
--- Serialize / Deserialize Ended ---

EDIT2:

I honestly don't know why, but when I replaced the simple String[] embedded in my TestObject with an ArrayList, it started serializing correctly.

--- Serialize / Deserialize Started ---
ID#: 1, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 2, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 3, i1: 12345, name: abcdefg, s[]: [a, b, c]
ID#: 4, i1: 12345, name: abcdefg, s[]: [a, b, c]
--- Serialize / Deserialize Ended ---

Java Solutions


Solution 1 - Java

You need to give Gson information on the specific generic type of List you're using (or any generic type you use with it). Particularly when deserializing JSON, it needs that information to be able to determine what type of object it should deserialize each array element to.

Type listOfTestObject = new TypeToken<List<TestObject>>(){}.getType();
String s = gson.toJson(list, listOfTestObject);
List<TestObject> list2 = gson.fromJson(s, listOfTestObject);

This is documented in the Gson user guide.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRogueDeusView Question on Stackoverflow
Solution 1 - JavaColinDView Answer on Stackoverflow