如何从GPT回复长文本中按JSON Schema提取并校验JSON?
更优的JSON提取与校验方案
针对从<pre><code>标签中提取JSON并校验的需求,你当前的贪婪正则+Schema校验方案存在明显局限性——正则很难精准处理HTML结构的变动(比如标签带属性、嵌套层级变化),也无法可靠匹配JSON的多层嵌套结构。以下是更可靠的优化方案:
核心思路
先通过HTML结构解析精准提取目标文本,再用原生JSON解析器验证格式合法性,最后做Schema校验,流程更严谨且容错性更强。
步骤拆解
精准提取code标签内容
放弃正则匹配整个HTML文本,改用专业的HTML解析库直接定位<pre>下的<code>标签,提取其中的纯文本内容。这类库能自动处理HTML的语法细节(比如转义字符、标签属性),确保拿到的是标签内的原始JSON文本,不会混入HTML标签或无关内容。预处理与JSON解析
对提取到的文本做简单预处理(比如去掉首尾空白、换行),然后直接用语言原生的JSON解析器尝试解析。原生解析器能完美处理JSON的嵌套结构,只要解析成功,就说明格式完全合法,这比正则匹配的准确性高得多——正则根本无法可靠处理多层嵌套的{}或[]。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
相关产品推荐
相关产品推荐

