Gson fromJson загружает только 1 элемент ArrayList в объект - PullRequest
1 голос
/ 24 августа 2011

У меня есть ArrayList<CustomClass> внутри ParentClass, который я записал в файл, используя Gson.toJson().Однако, когда я пытаюсь десериализовать JSON, используя Gson.fromJson(), я получаю только 1 элемент из ArrayList<CustomClass>.

Например, я сделаю следующее

public class ParentClass {
    private ArrayList<CustomClass> myList = new ArrayList<CustomClass>();

    private GrandParentClass nested;

    public ParentClass() {
        myList.add(new CustomClass("adsf"));
        myList.add(new CustomClass("fdsa"));

        nested = new GrandParentClass();
    }

    public int arraySize() {
        return myList.size();
    }
}

public class GrandParentClass {
    private ArrayList<OtherCustomClass> myList = new ArrayList<OtherCustomClass>();

    public GrandParentClass() {
        myList.add(new CustomClass("asdfasdf.."));
        myList.add(new CustomClass("fdsafdsa..."));

    }

    public int arraySize() {
        return myList.size();
    }
}

Тогда, когда яДля создания нового экземпляра ParentClass я использую следующее для записи его в файл.

ParentClass pc = new ParentClass();
Gson gson = new Gson();
String writeThis = gson.toJson(pc); // Produces a perfect JSON reflection myList

FileOutputStream fos = new FileOutputStream(new File("writeto.json"));
fos.write(writeThis);
fos.close();

Объект JSON записывается в виде простого текста в файл .json

FileInputStream fis = new FileInputStream(new File("writeto.json"));
char c;
StringBuffer sb = new StringBuffer();
while ((c = fis.read()) != -1)
    sb.append((char) c);

//Now this is where I only get 1 element of the ArrayList
Gson gson = new Gson();
ParentClass pc = gson.fromJson(sb.toString(), ParentClass.class);

Log.i("SIZE", "Size is " + pc.arraySize()); // Log output: 'Size is 1'

Сейчас, хотя я проверил, что в ArrayList в файле JSON действительно есть два элемента, в объект загружается только 1, используя fromJson.

Я просто сериализую их, но я быкак десериализовать ArrayList<OtherCustomClass> внутри GrandParentClass, который находится внутри ParentClass, одним махом.

По сути, я хочу сериализовать ArrayLists вложенных, возможно, на 3 или 4 слоя вниз в этой иерархии объектов, и десериализовать их в 1 ParentClass, который содержит эти вложенные ArrayLists<?>.Как это будет сделано?

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Вам нужно проделать дополнительную работу, если вы хотите десериализовать коллекцию, когда используются дженерики.Это объясняется здесь .

Однако я не уверен, как это применимо к вашему случаю, поскольку ваша коллекция «вложена» в неуниверсальный класс верхнего уровня.*

0 голосов
/ 03 сентября 2011
public class ParentClass {
    public static ArrayList<CustomClass> myList = new ArrayList<CustomClass>();

    private GrandParentClass nested;

    public ParentClass() {
        myList.add(new CustomClass("adsf"));
        myList.add(new CustomClass("fdsa"));

        nested = new GrandParentClass();
    }

    public int arraySize() {
        return myList.size();
    }
}

public class GrandParentClass {


    public GrandParentClass() {
        ParentClass.myList.add(new CustomClass("asdfasdf.."));
        ParentClass.myList.add(new CustomClass("fdsafdsa..."));

    }

    public int arraySize() {
        return ParentClass.myList.size();
    }
}

Поскольку вы снова объявляете и инициализируете один и тот же массив, существует вероятность потери данных.попробуйте это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...