字符串分割因非法分隔符失败,如何处理含HTTPS链接的键值对字符串?
问题:如何正确分割包含URL的JSON风格键值对字符串?
嗨,这个问题我太熟悉了!直接用split(":|,")处理这种字符串确实容易踩坑,尤其是遇到URL里的冒号时,完全会打乱键值对的结构。咱们一步步来解决这个问题:
最可靠的解决方案:使用JSON解析库
你的字符串本质是标准的JSON片段(只差外层的{}),最稳妥的方式是用成熟的JSON解析库来处理,比如Java中的Gson或Jackson。它们能完美处理所有边界情况——包括URL、特殊字符、转义序列等,根本不会出现误拆分的问题。
示例:用Gson解析
首先确保项目引入Gson依赖(如果是Maven,在pom.xml中添加):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
然后编写解析代码:
import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class JsonParserDemo { public static void main(String[] args) { // 你的原始字符串 String body = "\"jti\":\"4ef61081-e2e0-40e4-a9ad-8f2bf33f8923\",\"exp\":1525357546,\"nbf\":0,\"iat\":1525271146,\"iss\":\"https://dev.open-sunbird.org/auth/realms/sunbird\",\"aud\":\"admin-cli\""; // 补全外层的{},变成合法的JSON对象 String validJson = "{" + body + "}"; // 解析JSON JsonObject jsonObj = JsonParser.parseString(validJson).getAsJsonObject(); // 按需获取值 String jti = jsonObj.get("jti").getAsString(); long exp = jsonObj.get("exp").getAsLong(); String issUrl = jsonObj.get("iss").getAsString(); System.out.println("jti: " + jti); System.out.println("exp: " + exp); System.out.println("iss: " + issUrl); // 这里会完整输出URL,不会拆分 } }
应急方案:用正则表达式手动匹配(不推荐)
如果因为某些限制不能用JSON库,你可以用正则表达式匹配完整的键值对,避免误拆分URL里的冒号。不过这种方式只适用于结构简单、无特殊转义字符的字符串,不推荐用于复杂场景。
示例代码:
import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ManualParseDemo { public static void main(String[] args) { String body = "\"jti\":\"4ef61081-e2e0-40e4-a9ad-8f2bf33f8923\",\"exp\":1525357546,\"nbf\":0,\"iat\":1525271146,\"iss\":\"https://dev.open-sunbird.org/auth/realms/sunbird\",\"aud\":\"admin-cli\""; Map<String, String> keyValueMap = new HashMap<>(); // 正则规则:匹配 "键":"值" 或 "键":数字 的结构 Pattern kvPattern = Pattern.compile("\"([^\"]+)\":\"?([^\",]+)\"?"); Matcher matcher = kvPattern.matcher(body); while (matcher.find()) { String key = matcher.group(1); String value = matcher.group(2); keyValueMap.put(key, value); } // 验证结果 System.out.println("iss的值:" + keyValueMap.get("iss")); // 输出完整URL } }
正则说明:
"([^\"]+)":匹配被双引号包裹的键,确保键里没有双引号:"?([^\",]+)"?:匹配值,支持带双引号的字符串(里面无逗号和双引号)或不带双引号的数字,避免把URL里的冒号当成分隔符
总结
强烈优先使用JSON解析库,手动拆分或正则匹配都属于临时的“hack式”方案,遇到复杂JSON(比如值里有转义双引号、逗号)就会失效,而成熟的库能处理所有标准JSON的情况。
内容的提问来源于stack exchange,提问作者sumit
相关产品推荐
相关产品推荐

