Java如何从包含未知前置文本的字符串中提取多个JSON对象
提取混合文本中未知位置JSON的实现方案
核心思路
利用JSON结构的括号配对特性,不需要提前预知JSON的前置文本内容,通过层级计数匹配完整的JSON结构,再做合法性校验即可。
具体实现步骤
- 遍历整个原始字符串,维护括号计数器:遇到
{(要支持JSON数组可额外加[)时计数器+1,遇到}(对应数组加])时计数器-1。 - 当计数器从0变为1时,当前字符位置就是一个JSON对象的起始位置。
- 继续遍历直到计数器回到0,当前位置就是该JSON的结束位置,截取该区间的子串作为候选JSON。
- 对候选JSON做格式解析校验,解析成功的即为合法JSON对象存入结果集。
代码示例(Python版本)
import json def extract_all_jsons(raw_str: str) -> list: # 非标准JSON预处理:示例中的JSON用单引号,需转成标准JSON要求的双引号,按需调整预处理逻辑 processed = raw_str.replace("'", '"') str_len = len(processed) bracket_counter = 0 json_start_idx = -1 result = [] for idx in range(str_len): current_char = processed[idx] # 匹配JSON左边界,要支持数组可添加 or current_char == '[' if current_char == '{': if bracket_counter == 0: json_start_idx = idx bracket_counter += 1 # 匹配JSON右边界,要支持数组可添加 or current_char == ']' elif current_char == '}': bracket_counter -= 1 if bracket_counter == 0 and json_start_idx != -1: json_candidate = processed[json_start_idx: idx+1] # 合法性校验 try: valid_json = json.loads(json_candidate) result.append(valid_json) except json.JSONDecodeError: # 格式不合法直接跳过 pass json_start_idx = -1 return result # 测试用例 test_str = """ABCD XYZ JSON1: { 'key1':'val', 'key2':{ 'key2key1':'key2val1', 'key2key2':'key2val2'} }, MNO PQRS JSON2{"test": "val2"} """ print(extract_all_jsons(test_str))
注意事项
- 该方案可以正确处理JSON内容字符串中嵌套括号的场景,比如
{"desc": "带{括号}的普通文本"}不会被误截断。 - 如果原始JSON包含注释、转义特殊字符等非标准内容,需要先增加对应预处理逻辑再做解析。
- 如果需要提取根为数组的JSON,按照注释中的提示补充左右中括号的判断逻辑即可。
内容的提问来源于stack exchange,提问作者CHAITANYA PRASAD
相关产品推荐
相关产品推荐

