Gson fromJson只在对象中加载ArrayList的1个元素

时间:2011-08-24 03:46:27

标签: android json gson

我在ArrayList<CustomClass>内有一个ParentClass,我使用Gson.toJson()将其写入文件。但是,当我尝试使用Gson.fromJson()反序列化JSON时,我只获得ArrayList<CustomClass>的1个元素。

例如,我将执行以下操作

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'

现在,即使我已经确认JSON文件中的ArrayList确实存在两个元素,但只有1个元素使用fromJson加载到对象中。

我正在对这些进行序列化很好,但我想要一次性地反映ArrayList<OtherCustomClass>里面GrandParentClass内部ParentClass的内部ArrayLists

基本上我想序列化ArrayLists<?>在这个对象层次结构中嵌套可能3或4层,并将它们反序列化为包含这些嵌套{{1}}的1个ParentClass。这将如何实现?

由于

2 个答案:

答案 0 :(得分:2)

当您想要在涉及泛型时反序列化集合时,您需要做一些额外的工作。这解释为here

但是,我不确定这是如何适用于您的情况,因为您将集合“嵌套”在顶级非泛型类中。

答案 1 :(得分:0)

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();
    }
}

当您再次声明并使用相同的数组时,可能会丢失数据。试试这个