You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Gson将Map存入ListMap时遇语法错误,求解决方案

问题分析与解决方案

我来帮你梳理下问题所在,你的代码里有几个明显的错误和逻辑偏差,直接导致了JSON解析的语法异常,咱们一步步来修正:

核心问题拆解

1. Gson方法名拼写错误

你写的Gson().fromGson()是错的!Gson中解析JSON的正确方法是fromJson(),而且重复创建new Gson()实例也没必要,完全可以复用一个实例。

2. 逻辑错误:单个Map无法直接转成ArrayList

你把单个HashMap转成JSON后,得到的是JSON对象格式(比如{"title":"xxx", "des":"xxx"}),但你却试图用TypeToken<ArrayList<HashMap<String, Object>>>去解析它——Gson解析列表时,期望的是JSON数组格式(比如[{"title":"xxx", "des":"xxx"}, ...]),格式不匹配自然会抛出语法解析异常。

3. 集合初始化缺失

如果listmap1没有提前初始化(比如listmap1 = new ArrayList<>();),直接赋值会导致空指针或者集合操作异常。


正确实现步骤

咱们的目标是:把用户输入的键值对添加到列表中,将整个列表转成JSON字符串存入SharedPreferences,之后可以读取并展示在ListView中。

第一步:初始化核心对象(建议在Activity/Fragment的onCreate中完成)

private ArrayList<HashMap<String, Object>> listmap1;
private SharedPreferences sharedPreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    // 初始化列表
    listmap1 = new ArrayList<>();
    // 获取SharedPreferences实例
    sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
    
    // 可选:启动时读取已保存的列表并展示
    loadSavedList();
}

第二步:按钮点击事件的正确代码

// 按钮点击事件
btnSave.setOnClickListener(v -> {
    try {
        // 创建单个Map并填充用户输入的数据
        HashMap<String, Object> map = new HashMap<>();
        map.put("title", edttext1.getText().toString().trim());
        map.put("des", edittext2.getText().toString().trim());
        
        // 将单个Map添加到列表中
        listmap1.add(map);
        
        // 将整个列表转成JSON字符串
        Gson gson = new Gson();
        String jsonList = gson.toJson(listmap1);
        
        // 把JSON字符串存入SharedPreferences
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("saved_list", jsonList);
        editor.apply();
        
        // 清空输入框(可选优化)
        edttext1.setText("");
        edittext2.setText("");
        
        // 实时更新ListView展示
        updateListView();
        
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

第三步:从SharedPreferences读取并解析列表

private void loadSavedList() {
    String savedJson = sharedPreferences.getString("saved_list", null);
    if (savedJson != null) {
        Gson gson = new Gson();
        // 解析JSON字符串为ArrayList
        listmap1 = gson.fromJson(savedJson, new TypeToken<ArrayList<HashMap<String, Object>>>(){}.getType());
        // 更新ListView展示
        updateListView();
    }
}

第四步:更新ListView的示例(假设用SimpleAdapter)

private void updateListView() {
    ListView listView = findViewById(R.id.your_listview);
    // 定义列表项布局与数据键的对应关系
    String[] from = {"title", "des"};
    int[] to = {R.id.tv_title, R.id.tv_des};
    
    SimpleAdapter adapter = new SimpleAdapter(this, listmap1, R.layout.list_item_layout, from, to);
    listView.setAdapter(adapter);
}

为什么原来的代码会报错?

举个直观的例子:
你原来的代码把单个Map转成JSON是这样的:

{"title":"测试标题", "des":"测试描述"}

但Gson解析ArrayList时,期望的JSON格式是数组:

[{"title":"测试标题", "des":"测试描述"}]

格式不匹配就会触发JSON语法解析异常,这就是你遇到问题的根源。

内容的提问来源于stack exchange,提问作者shahril772

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:35:19