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

