如何仅用String.split从JSON片段提取ROUTE_UNIQUE_ID_REFERENCE值
如何仅用String.split从不完整JSON中提取ROUTE_UNIQUE_ID_REFERENCE的值?
嘿,我明白你的困境——因为API限制只能用String.split(),之前用Pattern和Matcher能成功提取值,但换成split就找不到目标结果了对吧?
为什么你之前的split代码没生效?
你之前写的正则是匹配整个键值对(比如"ROUTE_UNIQUE_ID_REFERENCE": "2172752",),但split()的核心逻辑是把匹配到的部分从原字符串中移除,剩下的内容拆分成数组元素。所以你的目标值2172752其实跟着匹配到的键值对一起被剔除了,自然在返回的数组里找不到它。
仅用split的最优解决方案
我们换个思路:先精准定位到目标键的位置,再分两步提取对应的值,逻辑清晰还高效:
package com.company; public class Main { public static void main(String[] args) { String myString = "{\n" + " \"8\": [\n" + " {\n" + " \"TEST\": \"LN17ELJ\",\n" + " \"ROUTE_UNIQUE_ID_REFERENCE\": \"2172752\",\n" + " \"ORDER_UNIQUE_ID_REFERENCE\": \"109197634\",\n" + " \"STATUS\": \"HORLEY\",\n" + " \"SECONDARY_NAV_CITY\": \"HORLEY\",\n" + " \"ROUTE\": \"THE STREET 12\",\n"; // 第一步:用目标键(兼容键与冒号、冒号与值之间的任意空格)分割字符串 String[] afterKey = myString.split("\"ROUTE_UNIQUE_ID_REFERENCE\"\\s*:\\s*\""); if (afterKey.length >= 2) { // 第二步:对分割后的第二部分用双引号拆分,第一个元素就是目标值 String[] valueParts = afterKey[1].split("\""); if (valueParts.length > 0) { System.out.println("提取到的值:" + valueParts[0]); } else { System.out.println("未找到对应值!"); } } else { System.out.println("未找到ROUTE_UNIQUE_ID_REFERENCE键!"); } } }
方案细节说明
- 第一次split的正则
"ROUTE_UNIQUE_ID_REFERENCE"\\s*:\\s*\":- 精准匹配目标键的完整字符串,
\\s*用来兼容键和冒号、冒号和值之间的任意空白字符(包括换行、空格、制表符) - 分割后数组的第二个元素,就是从目标值的第一个字符开始到后续的内容
- 精准匹配目标键的完整字符串,
- 第二次split用
"拆分:- 此时拆分出的第一个元素就是被双引号包裹的目标值,直接取出即可
这个方案不需要匹配整个键值对,只针对目标键做定位,避免了匹配无关内容的风险,而且逻辑简单易懂,完全满足你只能使用split的要求。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

