使用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
相关产品推荐
相关产品推荐

