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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:07:28