【问题标题】:how to convert list of objects to json using gson when object has ArrayList attribute当对象具有 ArrayList 属性时,如何使用 gson 将对象列表转换为 json
【发布时间】:2016-02-01 13:02:19
【问题描述】:

当我的应用程序首次启动时,我试图在 sharedpreference 中存储一些对象列表,并且我将在后续使用我的应用程序时使用此对象列表。 我的班级:

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

public class MyClass {
    private int a;
    private String b;
    private int c;
    private ArrayList<NameValuePair> d;

    public MyClass(int a, String b, int c) {
        super();
        this.a = a;
        this.b = b;
        this.c = c;

    }

    public MyClass(int a, String b, int c, ArrayList<NameValuePair> d) {
        super();
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public int getC() {
        return c;
    }

    public void setC(int c) {
        this.c = c;
    }

    public ArrayList<NameValuePair> getD() {
        return d;
    }

    public void setD(ArrayList<NameValuePair> d) {
        this.d = d;
    }

    public static List<MyClass> getMyObjects() {
        // TODO Auto-generated method stub
        List<MyClass> myObjects = new ArrayList<MyClass>();

        ArrayList<NameValuePair> temp1 = new ArrayList<NameValuePair>();
        temp1.add(new BasicNameValuePair("1", "20"));
        temp1.add(new BasicNameValuePair("2", "30"));
        temp1.add(new BasicNameValuePair("3", "40"));

        ArrayList<NameValuePair> temp2 = new ArrayList<NameValuePair>();
        temp2.add(new BasicNameValuePair("1", "50"));
        temp2.add(new BasicNameValuePair("2", "60"));
        temp2.add(new BasicNameValuePair("3", "70"));

        ArrayList<NameValuePair> temp3 = new ArrayList<NameValuePair>();
        temp3.add(new BasicNameValuePair("1", "50"));
        temp3.add(new BasicNameValuePair("2", "60"));
        temp3.add(new BasicNameValuePair("3", "70"));

        myObjects.add(new MyClass(1, "ABC", 20, temp1));
        myObjects.add(new MyClass(2, "DEF", 30, temp2));
        myObjects.add(new MyClass(3, "GHI", 40, temp3));

        return myObjects;
    }
}

我已经使用以下代码行创建了对象列表并存储在 sharedpreference 中:

 List<MyClass> myObjects = MyClass.getmyObjects();
    String myObjectsJSONString = new Gson().toJson(myObjects);
    prefsEditor.putString("MYOBJECTS", myObjectsJSONString);

将 myObjects 写入 sharedpreference 时按预期形成 JSON 字符串 示例:

 [{"d":[{"name":"1","value":"20"},{"name":"2","value":"30"},{"name":"3","value":"40"}],"b":"ABC","c":20,"a":1},{"d":[{"name":"1","value":"50"},{"name":"2","value":"60"},{"name":"3","value":"70"}],"b":"DEF","c":30,"a":2},{"d":[{"name":"1","value":"50"},{"name":"2","value":"60"},{"name":"3","value":"70"}],"b":"GHI","c":40,"a":3}]

在随后的使用中,我尝试使用以下代码行填充我的列表:

String myobjectsJSONString =appPrefs.getString("MYOBJECTS", null);
Type type = new TypeToken < List <MyClass>> () {}.getType();
List <MyClass> myObjects = new Gson().fromJson(myobjectsJSONString, type);

我能够从 sharedpreferences 存储和生成我的对象列表 没有属性“d”,它是ArrayList&lt;NameValuePair&gt; 类型;

但是,以“d”作为属性之一,我无法生成对象。

显示的错误是: java.lang.RuntimeException:无法为接口 org.apache.http.NameValuePair 调用无参数构造函数。使用 Gson 为该类型注册一个 InstanceCreator 可能会解决此问题

尝试从存储在 sharedpreference 中的 json 填充对象时引发上述异常

【问题讨论】:

  • 请将错误堆栈添加到您的问题中。
  • 主要是句子和代码的格式化。
  • NameValuePair 是如何定义的?你得到什么样的“一些错误” - 对于任何试图帮助你的人来说,这可能是重要的信息......
  • 请分享你的整个MyClass课程
  • 等等,是 NameValuePairinterface - Gson 的错误消息似乎暗示了......在这种情况下,只需尝试将其更改为一个类。

标签: java android arraylist gson android-sharedpreferences


【解决方案1】:

我想我现在明白了:您的 MyClass 包含一个字段

private  ArrayList<NameValuePair> d;

NameValuePair 然而,实际上是 Apache 的org.apache.http.NameValuePair,它是一个接口。因此,Gson 不能创建它的实例——它只能创建一个类的实例。

你可以试试改成

private  ArrayList<BasicNameValuePair> d;

但该类似乎没有无参数构造函数,因此它也可能不起作用(不过,这个答案说它应该:https://stackoverflow.com/a/18645370/763935)。

所以你最安全的选择可能是编写你自己的类来实现NameValuePair

public class MyNameValuePair implements NameValuePair {
    private final String name;
    private final String value;

    public MyNameValuePair() {
        this.name = null;
        this.value = null;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String getValue() {
        return this.value;
    }
}

【讨论】:

  • 感谢您的快速帮助...将其更改为 BasicNameValuePair 对我有用...
  • 无法投票...在我认为声望达到 15 之前它不会可见
【解决方案2】:

你可以这样做:

{
    "Result": [{
        "name": "1",
        "value": "100"
    }, {
        "name": "1",
        "value": "100"
    }, {
        "name": "1",
        "value": "100"

    }]
}

使用:

Type listType = new TypeToken<List<BeanClass.ResultEntity>>() {
            }.getType();

            List<BeanClass.ResultEntity> list = new Gson().fromJson(response.toString(), listType);

它肯定会起作用的......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2020-06-26
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多