如何将JSON Key/JWK转为Java HashMap<String,Object>提取private对象
实现方法
你拿到的字符串存在两个问题:一是首尾多了一层无意义的双引号,二是内容本身是无引号的类JS对象格式,不符合标准JSON规范,按以下步骤处理即可转换为HashMap<String, Object>并取出private对象:
步骤1:预处理原始字符串
首先剥掉首尾多余的双引号,再通过简单正则补全键、字符串值缺失的双引号,把内容修正为标准JSON格式,示例预处理逻辑:
// 从properties读取到的原始内容 String rawPropValue = "\"{ private: { a: adasdas, b: asdasdasd, c: asdasdas} }\""; String standardJson = rawPropValue // 移除首尾包裹的多余双引号 .replaceFirst("^\"", "") .replaceFirst("\"$", "") // 给所有对象key补双引号:匹配{或逗号后、冒号前的键名 .replaceAll("([{,]\\s*)([a-zA-Z0-9_-]+)(\\s*:)", "$1\"$2\"$3") // 给所有字符串类型value补双引号:匹配冒号后、逗号或大括号前的值,兼容JWK的base64字符 .replaceAll("(:\\s*)([a-zA-Z0-9_+/=-]+)(\\s*[},])", "$1\"$2\"$3");
处理完成后你会得到标准JSON结构:
{ "private": { "a": "adasdas", "b": "asdasdasd", "c": "asdasdas" } }
步骤2:解析为HashMap并提取private对象
直接用项目中已引入的JSON解析库把标准JSON转成嵌套HashMap即可,以下是两种常用库的实现示例:
- 基于Jackson实现:
ObjectMapper objectMapper = new ObjectMapper(); HashMap<String, Object> resultMap = objectMapper.readValue(standardJson, new TypeReference<HashMap<String, Object>>() {}); // 提取private对象,本身也是键值对结构,强转为Map即可 HashMap<String, Object> privateJwk = (HashMap<String, Object>) resultMap.get("private");
- 基于Fastjson实现:
HashMap<String, Object> resultMap = JSON.parseObject(standardJson, new TypeReference<HashMap<String, Object>>() {}); HashMap<String, Object> privateJwk = (HashMap<String, Object>) resultMap.get("private");
注意事项
- 如果JWK内容中包含逗号、冒号、大括号这类特殊字符,正则补全引号的逻辑可能出现误匹配,最稳妥的方案是直接在参数存储中保存标准JSON格式的JWK,从源头规避格式不规范问题。
- 上述正则的值匹配规则已经兼容JWK常用的base64编码字符(包含
+///=/-),可以覆盖绝大多数常规JWK场景。
内容的提问来源于stack exchange,提问作者Kelvin Davis
相关产品推荐
相关产品推荐

