如何将含首尾大括号的键值对字符串转换为Java HashMap
带首尾大括号的键值对字符串转Java HashMap实现
原有逻辑失效的核心原因是未提前剥离字符串首尾固定包裹的{、}字符,直接把整串纳入键值对切分流程,最终导致首键带{前缀、尾值带}后缀,拆分得到的键值和预期结构完全不匹配。只要在原逻辑前增加一步大括号剔除的预处理,剩余的字符串结构和之前可正常运行的无大括号输入完全一致,无需重构整套切分逻辑。
实现步骤
- 预处理字符串:先去除首尾可能存在的空白,再截取剔除首尾大括号的核心内容,规避无效字符对切分逻辑的干扰
- 切分键值对片段:将预处理后的字符串按分隔规则拆分为单个键值对条目
- 拆分键值:对每个条目按
=分隔符拆分为独立的键和值,同步去除键值两侧的多余空白 - 收集结果:通过Stream收集器将拆分后的键值对组装为HashMap实例
参考代码
import java.util.Arrays; import java.util.HashMap; import java.util.stream.Collectors; public class MapConvertDemo { public static void main(String[] args) { String datasample = "{SessionID=ACVRT5678897DERT, Name=ACFGTYR, Age=34, sessionTime=20210428}"; // 提前计算去空白后的字符串,避免重复调用trim() String trimmedInput = datasample.trim(); HashMap<String, String> resultMap = Arrays.stream( // 截取从第一个字符到倒数第二个字符的内容,直接剔除首尾的{和} trimmedInput.substring(1, trimmedInput.length() - 1) // 用正则按逗号+任意数量的空白切分,兼容逗号后无空格、多空格、制表符的场景 .split(",\\s*") ) // 过滤不包含=的非法条目,避免后续拆分时数组越界 .filter(pairStr -> pairStr.contains("=")) .map(pairStr -> pairStr.split("=")) .collect(Collectors.toMap( kv -> kv[0].trim(), kv -> kv[1].trim(), // 遇到重复键时保留首次出现的值,避免抛出重复键异常 (oldVal, newVal) -> oldVal, HashMap::new )); // 验证输出结果 System.out.println(resultMap); } }
兼容优化说明
- 替换硬编码的
,分隔规则为正则,\\s*,可适应不同格式的空白分隔场景,降低对输入格式的强依赖 - 增加非法条目过滤逻辑,跳过结构异常的内容片段,避免运行时出现索引越界错误
- 重复键的处理策略可根据实际业务调整,比如设置为覆盖旧值、拼接多值等
内容的提问来源于stack exchange,提问作者user15345826
相关产品推荐
相关产品推荐

