web-dev-qa-db-fra.com

Problème avec Gson la sérialisation d'une liste de tableaux de POJO

J'avais prévu d'utiliser simpleXML pour mes besoins en sérialisation, mais j'ai décidé d'essayer JSON pour apprendre quelque chose de nouveau.

C'est le code que j'utilise pour essayer de sérialiser une ArrayList de POJO de test à l'aide de Gson 1.7.1.

Remarque: j'ai supprimé le lecteur/graveur pour une chaîne "s" afin de simplifier le 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) );
    }
}

Voici la sortie que je reçois:

[{"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

Pour mes débutants, cela semble correct. Seulement, la liste d'objets DeSerialized contient des objets de base, plutôt que ceux de TestObject I sérialisés. Quelqu'un peut-il m'expliquer s'il vous plaît quoi que ce soit que je puisse faire pour que cela fonctionne?

EDIT:

Corrigé pour tester: Merci à 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 ---");
    }
}

sortie:

--- 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:

Honnêtement, je ne sais pas pourquoi, mais lorsque j'ai remplacé le simple String [] incorporé dans mon TestObject par un ArrayList, la sérialisation a commencé correctement.

--- 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 ---
68
RogueDeus

Vous devez donner à Gson des informations sur le type générique spécifique de List que vous utilisez (ou sur tout type générique que vous utilisez avec). En particulier lors de la désérialisation de JSON, il a besoin de ces informations pour pouvoir déterminer le type d'objet pour lequel il doit désérialiser chaque élément du tableau.

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

Ceci est documenté dans le Guide de l'utilisateur Gson .

163
ColinD