2011-08-24 2 views
1

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

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

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<?>. Как это будет сделано?

Благодаря

+0

Просто из любопытства, почему вы решили использовать GSON? Я использую [jackson] (http://jackson.codehaus.org/) для скорости разбора. Я просто хочу знать, стоит ли мне смотреть в GSON. – javelinBCD

ответ

2

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

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

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

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

Смежные вопросы