You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:54:00