如何在Java中正确保存和加载以List<String>为键的HashMap到JSON文件
问题分析与解决方案
核心问题:不合法的JSON格式
你直接将HashMap<List<String>, Integer>对象存入JSON时,实际调用的是HashMap.toString()方法,得到的是Java对象的字符串表示(比如{[a,b]=2}),这并不是合法的JSON格式。JSON要求键必须是双引号包裹的字符串,而你保存的内容不符合规范,所以Jackson解析时会抛出JsonParseException。
正确的保存方式
使用Jackson的ObjectMapper将HashMap序列化为合法的JSON字符串,再存入JSON对象:
ObjectMapper mapper = new ObjectMapper(); // 将HashMap序列化为标准JSON字符串 String imageDataJson = mapper.writeValueAsString(application.imageInfo); // 存入目标JSON对象 dataJson.put("ImageData", imageDataJson);
保存后的合法JSON示例(Jackson会自动将列表键转为标准JSON数组字符串):
"ImageData": "{\"[\"ProjectName\",\"Time/Date\",\"Long\",\"Lat\",\"Altitude\",\"Address\",\"Code\",\"Note\",\"Direction\",\"NE\"]\":2, \"[\"ProjectName\",\"Time/Date\",\"Long\",\"Lat\",\"Altitude\",\"Address\",\"Code\",\"Note\",\"Direction\",\"NE\"]\":1}"
正确的加载方式
利用Jackson的TypeReference明确泛型类型,避免未检查转换错误:
ObjectMapper mapper = new ObjectMapper(); String imageDataStr = json.getString("ImageData"); // 通过TypeReference指定HashMap的泛型参数,保证类型安全 HashMap<List<String>, Integer> result = mapper.readValue( imageDataStr, new TypeReference<HashMap<List<String>, Integer>>() {} ); application.imageInfo = result;
手动解析方案(你找到的可行方法)
如果暂时无法修改保存逻辑,可以用字符串拆分的方式手动解析,但要注意边界风险:如果列表元素中包含逗号、引号等特殊字符,拆分逻辑会失效。代码如下:
String[] parts = hashstr.split(",\""); for (String part : parts) { String[] splithash = part.replace("[", "").replace("]", "").replace("{", "").split("\":"); application.imageInfo.put(Arrays.asList(splithash[0].replace("\"", "").split(",")), Integer.parseInt(splithash[1].replace("}", ""))); }
内容的提问来源于stack exchange,提问作者Phantom37
相关产品推荐
相关产品推荐

