如何序列化/反序列化(JSON)ArrayLIst wich has an ArrayLIst as field in Java

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何序列化/反序列化(JSON)ArrayLIst wich has an ArrayLIst as field in Java相关的知识,希望对你有一定的参考价值。

我是android编程世界的新手,我在使用JSON序列化和反序列化自定义对象的ArrayList方面遇到了一些问题。我知道如何序列化对象,但不知道如果它有一个ArrayList作为字段。

我找到了GSON库,但我真的不知道如何使用它。

我有一个类A的ArrayList,它有一个类B的ArrayList。我正在使用toJSON()方法序列化类A:

public class A
{
     //Some fields like title, id...
     private String mTitle;
     private ArrayList<B> mArray; //I don't know how to serialize/deserialize this field

     public A(){...}
     public A(JSONObject json){...}

     public JSONObject toJSON() throws JSONException //method I use to convert my object into a JSONObject
     {
          JSONObject json = new JSONObject();
          json.put("TITLE",mTitle);

          return json;
     }

}

public class B
{
     //some fields like a double, String...
     public B(){...}

}

如果我的问题不明确,请询问更多细节。

对不起,如果我犯了错误。谢谢你的帮助。

答案

如果是收集,则必须指定类型。

See a Guide User

在你的情况下,我认为这将解决:

Type collectionType = new TypeToken<Collection<A>>(){}.getType();
Collection<A> list = gson.fromJson(json, collectionType);   

A是你的班级。

另一答案

你想使用Parcelable吗?尝试这样的事情(伪代码):

public class ParcelableObject implements Parcelable{

List<ObjectB> _customObjectList = new ArrayList<ObjectB>();

@Override
public void writeToParcel(Parcel outParcel_, int arg1) {
outParcel_.writeTypedList(_customObjectList); //where _customObjectList is your list variable
}


//Then in your constructor which takes in a Parcel:

public ParcelableObject(Parcel parcelIn_) {
parcelIn_.readTypedList(_customObjectList, ObjectB.CREATOR);
}

}

对象B

public class ObjectB implements Parcelable{

int _randomInt;

    public static final Parcelable.Creator<ObjectB> CREATOR = new Parcelable.Creator<ObjectB>() {
        @Override
        public ObjectBcreateFromParcel(Parcel in) {
            return new ObjectB(in);
        }

        @Override
        public ObjectB[] newArray(int size) {
            return new ObjectB[size];
        }
    };

    public ObjectB(Parcel parcelIn_) {
          _randomInt = parcelIn_.readInt();

    }



    @Override
    public void writeToParcel(Parcel out_, int flags) {
        out_.writeInt(_randomInt);
    }
}
另一答案

更好的是做这样的事情:

List<YourObject> myList = new Genson().deserialize(dta.toString(), List.class);

以上是关于如何序列化/反序列化(JSON)ArrayLIst wich has an ArrayLIst as field in Java的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jackson 将 JSON 反序列化为 ArrayList<POJO>

JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例

无法将 java.util.ArrayList 的实例反序列化出 VALUE_STRING

使用 Jackson 将嵌套数组反序列化为 ArrayList

无法从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例

无法将 JSON 数组反序列化为 C# 对象 [关闭]