69 votes

Problème avec Gson qui sérialise une liste de tableaux de POJO

Je suis un nouveau codeur Java, faire tout ce que je peux apprendre tout ce que je peux. J'avais été l'intention de l'utiliser simpleXML pour mon sérialisation besoins, mais pensé que je voudrais essayer Json, pour apprendre quelque chose de nouveau. Ceci a conduit à la plus frustrante de 12 heures que j'ai passées dans un temps long.

C'est le code que j'utilise essayer et de sérialiser une liste de tableaux de test POJO l'aide de Gson 1.7.1. Gardez à l'esprit que je suis très nouveau à la sérialisation en général, de sorte s'il vous plaît être douce si la réponse est évidente. Note: j'ai supprimé les lecteurs/enregistreurs pour une Chaîne "s" pour 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) );
    }
}

Ici est le résultat que j'obtiens:

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

À mon newbie yeux, cela semble correct. Seulement, le Désérialisé liste d'objets contient les Objets de base, plutôt que de la TestObject je sérialisé. Quelqu'un peut-il m'expliquer qu'est-ce que je peux faire pour faire ce travail?

Merci.

EDIT:

Corrigé de test: Grâce à 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 quand j'ai remplacé le simple String[] enfouies dans mon TestObject avec une liste de tableaux, il a commencé la sérialisation 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 ---

166voto

ColinD Points 48573

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 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X