将共享首选项与Gson一起使用

zmeyuzjn  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(297)

我用GsonSharedPreferences加载数据时遇到问题。我有Product类的ArrayLists对象。我想保存它们,然后加载它们。下面是我的loadList方法:

public void loadList(ArrayList list, String name){
        SharedPreferences sharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString(name, null);
        Type type = new TypeToken<ArrayList<Product>>() {}.getType();
        list = gson.fromJson(json, type);
        //Toast.makeText(this, ""+list.size(), Toast.LENGTH_SHORT).show();

        if(list == null){
            list = new ArrayList<>();
        }
    }

当我使用这个没有参数的方法时,一切都很好。但是当我试图将ArrayList作为参数发送时,它就不起作用了,并且list加了下划线。

mcdcgff0

mcdcgff01#

假设有一个Json文件,如下所示:

[
  {
    "name": "product1",
    "itemNumber": "123"
  },
  {
    "name": "product2",
    "itemNumber": "456"
  }
]

要解析这个json,需要有一个model类,在本例中有Product:

data class Product(val name: String, val itemNumber: String)

在这个例子中,我已经在assets文件夹中保存了预定义的json文件,但是在你的例子中,你是从SharedPreference中阅读它的。我认为这是导致这个问题的原因。因为在成功地从json中读取之后,我能够在required List中解析json。
你可以参考下面的方法,它可以给予你一些关于解析的想法。

void parseGson() {
    String json = null;
    try {
        InputStream is = getAssets().open("input.json"); //file name placed in assets folder
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, "UTF-8");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    Type type = new TypeToken<ArrayList<Product>>() {}.getType();
    List<Product> list = new Gson().fromJson(json, type);
    System.out.println(list);
}

输出量:

I/System.out: [Product(name=product1, itemNumber=123), Product(name=product2, itemNumber=456)]

如果你需要更多的帮助,你需要提供json文本和产品型号的代码。我希望它能帮助你解决你的问题。

相关问题