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

使用Gson转换字符串为Map<Integer,String>时遇MalformedJsonException错误

问题分析与解决方案

嘿,我一眼就看出问题啦!你遇到的MalformedJsonException完全是因为传入的字符串根本不是标准JSON格式——它看起来更像是Java里HashMap.toString()输出的结果,但Gson只认严格符合JSON规范的字符串,直接解析肯定会报错。

具体哪里不符合JSON规范?

咱们对比你的输入和标准JSON的核心差异:

  • JSON要求所有键必须用双引号包裹(比如"4"),但你的键是裸数字(比如4)
  • JSON的键值对用冒号:分隔,你用的是等号=
  • 你的空值写法是4=,在JSON语法里属于不完整的键值对,会被判定为语法错误

怎么解决?

有两个靠谱的方案,你可以根据场景选择:

方案1:把输入字符串转换成标准JSON格式

如果没办法直接拿到合法JSON,只能处理现有这个HashMap风格的字符串,可以用正则表达式把它转成符合规范的JSON:

public static String convertHashMapStyleToJson(String input) {
    // 给数字键加上双引号,同时把=替换成JSON要求的:
    String json = input.replaceAll("(\\d+)=", "\"$1\":");
    // 把空值(比如:,)替换成合法的空字符串格式:"",
    json = json.replaceAll(":,(?=\\s)", ":\"\",");
    // 处理末尾可能存在的空值(比如最后一个键是7=的情况)
    json = json.replaceAll(":$", ":\"\"");
    return json;
}

之后用转换后的JSON调用你的解析方法即可:

String originalStr = "{4=, 1=3:00 pm–4:00 pm, 7=, 6=2:00 am–3:00 am, 5=8:00 am–9:00 am, 3=1:00 am–2:00 am, 2=9:00 am–10:00 am}";
String validJson = convertHashMapStyleToJson(originalStr);
// 显式指定泛型类型,避免推断错误
HashMap<Integer, String> map = strMapToHashmap<Integer, String>(validJson);

方案2:直接序列化HashMap(推荐)

如果这个字符串是从Java的HashMap转来的,那完全没必要先调用toString()再解析——直接用Gson把HashMap序列化成JSON字符串,之后再解析会更可靠,从根源避免格式问题:

// 假设你有一个现成的HashMap<Integer, String> originalMap
Gson gson = new GsonBuilder().create();
// 序列化HashMap为标准JSON
String jsonStr = gson.toJson(originalMap);
// 解析回HashMap类型
HashMap<Integer, String> parsedMap = gson.fromJson(jsonStr, new TypeToken<HashMap<Integer, String>>() {}.getType());

这种方式完全不会出现格式错误,因为Gson自己生成的JSON肯定是符合规范的。

补充说明

你的泛型解析方法本身没问题,但调用时最好显式指定泛型参数(比如strMapToHashmap<Integer, String>(validJson)),避免编译器类型推断异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:14:05