【问题标题】:i can't serialize my Arraylist to JSON with gson我无法使用 gson 将我的 Arraylist 序列化为 JSON
【发布时间】:2021-06-14 13:56:56
【问题描述】:

我正在尝试将我的对象数组传递给 JSON,但是当我这样做时,应用程序崩溃并且日志中没有任何消息。 下面我放了代码,我是一个新手,这肯定是一个愚蠢的错误。提前致谢。

public class Modelo implements Serializable {
@SerializedName("nombre")
private String nombre;
@SerializedName("edad")
private CheckBox edad;
@SerializedName("image")
private int image;
@SerializedName("txt")
private TextView txt;




public TextView getTxt() {
    return txt;
}

public void setTxt(TextView txt) {
    this.txt = txt;
}



public Modelo() {

}

public Modelo(String nombre, CheckBox edad, int image) {
    this.nombre = nombre;
    this.edad = edad;
    this.image = image;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public CheckBox getEdad() {
    return edad;
}

public void setEdad(CheckBox edad) {
    this.edad = edad;
}

public int getImage() {
    return image;
}

public void setImage(int image) {
    this.image = image;
}
}

这里将对象数组传递给 JSON 和另一个检索它的方法。

   public <T> void setList(String key, List<Modelo> list) {
     Gson gson = new Gson();
     String json = gson.toJson(list);
     set(key, json);
}

public void set(String key, String value) {
    SharedPreferences sharedPreferences =getApplicationContext().getSharedPreferences("list", Context.MODE_PRIVATE);

    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
}
public List<Modelo> getList(){
 SharedPreferences sharedPreferences =getApplicationContext().getSharedPreferences("list", Context.MODE_PRIVATE);

 SharedPreferences.Editor editor = sharedPreferences.edit();
    List<Modelo> arrayItems=new ArrayList<>();
    String serializedObject = sharedPreferences.getString("key", null);
    if (serializedObject != null) {
        Gson gson = new Gson();
        Type type = new TypeToken<List<Modelo>>(){}.getType();
        arrayItems = gson.fromJson(serializedObject, type);
    }
    return  arrayItems;
}

这是我调用方法的部分,也是它让我崩溃的部分。如果有必要我把整个代码都放了,我不想让你觉得无聊。

     mAdapter = new ListAdapter(this, R.layout.item_row, mLista);

    List<Modelo> mLista=new ArrayList<>();
    myListView.setAdapter(mAdapter);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setList("key",mLista);
        }
    });

【问题讨论】:

    标签: java android arraylist


    【解决方案1】:

    我明白你的问题了。

    不能使用Gson序列化UI相关的类如CheckBox、Textview、Webview等。

    您的 Modelo 类应该只有 String nombreint image 通过删除与 UI 相关的类(例如 CheckBox edad)作为可序列化。

    要让 Gson 可序列化,数据必须是 Json 友好的(例如 String、int、Float 等)

    请问,为什么要序列化CheckBox? 欢迎提出更多问题。

    【讨论】:

    • 非常感谢您的回答,因为我正在发送 UI 对象,因为如果我在自定义适配器中实例化它们时没有这样做,我将无法引用它们并且它们有意外的行为,让我解释一下,对于列表视图中的每个项目,我都实例化了一个复选框和一个编辑文本,创建了一个静态 Holder,但是在使用它时,我看到了一个问题,例如,当我按下 check1 时,check5 会对我产生作用以及类似的事情.所以我知道我必须删除所有这些元素才能将其存储为 json。
    • 我看到您正在尝试实现Android开发中的通用模式;从 Recyclerview 适配器获取回调。您需要做的是让适配器通过一个名为 Listener 的接口类来引用 UI。将 UI 元素直接发送到适配器会在未来引起很多问题。请参阅此链接以了解如何制作监听器类。 medium.com/android-gate/…
    【解决方案2】:

    在初始化变量之前,您正在使用mLista。试试这个:

    List<Modelo> mLista=new ArrayList<>();
    mAdapter = new ListAdapter(this, R.layout.item_row, mLista);
    

    这还有另一个问题。您的模型类 Modelo 包含 UI 小部件 CheckBox,Gson 无法对其进行序列化

    【讨论】:

      【解决方案3】:

      在您的Modelo 类中,您拥有CheckBoxTextView 之类的字段。这些是具有大量内部状态的框架类,不仅可以轻松序列化为 json。

      您应该只尝试序列化状态,例如。 TextView 的文本(字符串)或 CheckBox 的布尔状态。稍后,当您从 json 读取状态时,您可以根据存储的值设置 UI,无需存储整个 UI 组件。

      【讨论】:

        猜你喜欢
        • 2020-10-08
        • 1970-01-01
        • 2012-02-02
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-08
        相关资源
        最近更新 更多