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

如何自动格式化非标准嵌套JSON并转为Java的HashMap?

无引号类JSON字符串转Java HashMap的解决方案

你的原始字符串不属于标准JSON格式,标准JSON要求所有键和字符串值必须用双引号包裹,因此直接用默认配置的ObjectMapper解析会失败(你得到空Map大概率是未捕获解析异常,导致变量未正确初始化)。以下是两种可行的解决方法:

方法一:用Jackson的YAML解析器兼容非标准JSON

YAML是JSON的超集,允许无引号的键和字符串值,可以借助Jackson的YAML数据格式模块来解析你的字符串:

  1. 先添加Maven依赖(使用Gradle则对应调整配置):
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.15.2</version> <!-- 使用与你的Jackson核心版本一致的版本 -->
</dependency>
  1. 编写解析代码:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.databind.type.TypeReference;
import java.util.Map;

public class JsonParseDemo {
    public static void main(String[] args) throws Exception {
        String rawString = "{ history:{name:[{value:Jim, details:Final}],job:[{value:Builder, details:Pending}]} }";
        
        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
        // 关闭YAML文档起始标记,避免输出额外内容
        mapper.disable(com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
        
        Map<String, Object> resultMap = mapper.readValue(rawString, new TypeReference<Map<String, Object>>() {});
        System.out.println(resultMap);
    }
}

方法二:手动格式化字符串为标准JSON

如果不想引入额外依赖,可以用正则表达式给键和字符串值添加双引号,转换为标准JSON后再解析:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeReference;
import java.util.Map;

public class JsonFormatDemo {
    public static void main(String[] args) throws Exception {
        String rawString = "{ history:{name:[{value:Jim, details:Final}],job:[{value:Builder, details:Pending}]} }";
        
        // 步骤1:给所有键添加双引号
        String formatted = rawString.replaceAll("(\\w+):", "\"$1\":");
        // 步骤2:给字母开头的字符串值添加双引号(避免给数字加引号)
        formatted = formatted.replaceAll(":\\s*([a-zA-Z_]\\w*)", ": \"$1\"");
        
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> resultMap = mapper.readValue(formatted, new TypeReference<Map<String, Object>>() {});
        System.out.println(resultMap);
    }
}

注意:正则表达式的方式仅适用于简单场景,如果你的字符串包含特殊字符(如空格、符号),可能需要调整正则逻辑。

补充:排查解析失败的原因

建议在解析代码中添加异常捕获,明确错误原因:

try {
    Map<String, Object> map = new ObjectMapper().readValue(jsonString, new TypeReference<Map<String, Object>>() {});
} catch (Exception e) {
    e.printStackTrace(); // 打印解析异常,定位问题
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:25:17