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

如何从GPT回复长文本中按JSON Schema提取并校验JSON?

更优的JSON提取与校验方案

针对从<pre><code>标签中提取JSON并校验的需求,你当前的贪婪正则+Schema校验方案存在明显局限性——正则很难精准处理HTML结构的变动(比如标签带属性、嵌套层级变化),也无法可靠匹配JSON的多层嵌套结构。以下是更可靠的优化方案:

核心思路

先通过HTML结构解析精准提取目标文本,再用原生JSON解析器验证格式合法性,最后做Schema校验,流程更严谨且容错性更强。

步骤拆解

  1. 精准提取code标签内容
    放弃正则匹配整个HTML文本,改用专业的HTML解析库直接定位<pre>下的<code>标签,提取其中的纯文本内容。这类库能自动处理HTML的语法细节(比如转义字符、标签属性),确保拿到的是标签内的原始JSON文本,不会混入HTML标签或无关内容。

  2. 预处理与JSON解析
    对提取到的文本做简单预处理(比如去掉首尾空白、换行),然后直接用语言原生的JSON解析器尝试解析。原生解析器能完美处理JSON的嵌套结构,只要解析成功,就说明格式完全合法,这比正则匹配的准确性高得多——正则根本无法可靠处理多层嵌套的{}或[]。

  3. JSON Schema校验
    解析成功后,再用Schema校验确保JSON结构符合业务需求,这一步可以保留你的现有逻辑。

代码示例(Python)

from bs4 import BeautifulSoup
import json
from jsonschema import validate, ValidationError

# 示例HTML内容
html_content = '''<pre><code>{
  "foo":{ "bar" : ["1"] }
}</code></pre>'''

# 1. 解析HTML提取目标文本
soup = BeautifulSoup(html_content, 'html.parser')
code_text = soup.find('pre').find('code').get_text(strip=False)
cleaned_json_text = code_text.strip()

# 2. 验证JSON格式合法性
try:
    parsed_json = json.loads(cleaned_json_text)
    print("JSON格式验证通过")
except json.JSONDecodeError as e:
    print(f"JSON格式错误:{e}")
    exit()

# 3. JSON Schema校验
target_schema = {
    "type": "object",
    "properties": {
        "foo": {
            "type": "object",
            "properties": {"bar": {"type": "array", "items": {"type": "string"}}},
            "required": ["bar"]
        }
    },
    "required": ["foo"]
}

try:
    validate(instance=parsed_json, schema=target_schema)
    print("Schema校验通过")
except ValidationError as e:
    print(f"Schema校验失败:{e}")

方案优势

  • 可靠性更高:HTML解析库能应对各种复杂的HTML结构(比如标签带class属性、多pre/code块共存),不会像正则那样因为HTML的微小变动就匹配失败。
  • 准确性更强:原生JSON解析器是处理JSON格式的权威工具,能识别所有合法的JSON结构,包括多层嵌套、特殊字符转义等,正则完全无法做到这一点。
  • 易于维护:逻辑分层清晰,后续调整提取规则或Schema都更方便,不需要修改复杂的正则表达式。

内容的提问来源于stack exchange,提问作者genechu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:03:28