如何自动格式化非标准嵌套JSON并转为Java的HashMap?
无引号类JSON字符串转Java HashMap的解决方案
你的原始字符串不属于标准JSON格式,标准JSON要求所有键和字符串值必须用双引号包裹,因此直接用默认配置的ObjectMapper解析会失败(你得到空Map大概率是未捕获解析异常,导致变量未正确初始化)。以下是两种可行的解决方法:
方法一:用Jackson的YAML解析器兼容非标准JSON
YAML是JSON的超集,允许无引号的键和字符串值,可以借助Jackson的YAML数据格式模块来解析你的字符串:
- 先添加Maven依赖(使用Gradle则对应调整配置):
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>2.15.2</version> <!-- 使用与你的Jackson核心版本一致的版本 --> </dependency>
- 编写解析代码:
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
相关产品推荐
相关产品推荐

