2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

OpenAI API JSON格式指南与json_repair错误修复

发布日期:2025-05-10 22:04:34 浏览次数: 2742
作者:ChallengeHub

微信搜一搜,关注“ChallengeHub”

推荐语

掌握OpenAI API JSON格式,轻松处理复杂数据。

核心内容:
1. OpenAI API返回JSON格式的核心参数配置
2. 基本JSON格式响应及复杂结构化数据请求示例
3. JSON错误处理与修复技巧

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家


核心参数是response_format={"type": "json_object"}  ,其他支持json调用的模型也可以这样使用的,下面我们以Openai模型为例

指定OpenAI API返回JSON格式

基本JSON格式响应示例

import openai

client = openai.OpenAI(api_key="your-api-key")


response = client.chat.completions.create(
    model="gpt-4-turbo",
    response_format={"type""json_object"},
    messages=[
        {"role""system""content""你是一个返回JSON格式的助手。"},
        {"role""user""content""返回包含用户名、年龄和爱好的JSON"}
    ]
)

print(response.choices[0].message.content)
# 输出示例:
# {
#   "name": "John Doe",
#   "age": 30,
#   "hobbies": ["reading", "hiking", "photography"]
# }

更复杂的结构化数据请求

response = client.chat.completions.create(
    model="gpt-4-turbo",
    response_format={"type""json_object"},
    messages=[
        {"role""system""content""你是一个返回JSON格式的助手。"},
        {"role""user""content""生成5个用户的数据,包括姓名、电子邮件和订阅状态"}
    ]
)

print(response.choices[0].message.content)
# 输出示例:
# {
#   "users": [
#     {"id": 1, "name": "Alice Smith", "email": "alice@example.com", "subscribed": true},
#     {"id": 2, "name": "Bob Johnson", "email": "bob@example.com", "subscribed": false},
#     {"id": 3, "name": "Carol Williams", "email": "carol@example.com", "subscribed": true},
#     {"id": 4, "name": "David Brown", "email": "david@example.com", "subscribed": true},
#     {"id": 5, "name": "Eve Davis", "email": "eve@example.com", "subscribed": false}
#   ]
# }

使用函数调用确保JSON响应

response = client.chat.completions.create(
    model="gpt-4-turbo",
    messages=[
        {"role""system""content""你是一个帮助用户的助手。"},
        {"role""user""content""分析以下文本的情感:'我今天非常开心,但天气不太好'"}
    ],
    tools=[{
        "type""function",
        "function": {
            "name""analyze_sentiment",
            "description""分析文本的情感",
            "parameters": {
                "type""object",
                "properties": {
                    "text": {"type""string""description""要分析的文本"},
                    "sentiment": {"type""string""enum": ["positive""negative""neutral""mixed"]},
                    "confidence": {"type""number""description""情感分析的置信度"},
                    "details": {
                        "type""object",
                        "properties": {
                            "positive_aspects": {"type""array""items": {"type""string"}},
                            "negative_aspects": {"type""array""items": {"type""string"}}
                        }
                    }
                },
                "required": ["sentiment""confidence"]
            }
        }
    }],
    tool_choice={"type""function""function": {"name""analyze_sentiment"}}
)

print(response.choices[0].message.tool_calls[0].function.arguments)
# 输出示例:
# {
#   "text": "我今天非常开心,但天气不太好",
#   "sentiment": "mixed",
#   "confidence": 0.85,
#   "details": {
#     "positive_aspects": ["今天非常开心"],
#     "negative_aspects": ["天气不太好"]
#   }
# }

处理特定场景的JSON返回格式

示例1: 中文内容的JSON格式


response = client.chat.completions.create(
    model="gpt-4-turbo",
    response_format={"type""json_object"},
    messages=[
        {"role""system""content""你是一个返回JSON格式的助手。"},
        {"role""user""content""返回一个包含中文句子及其英文翻译的JSON数组"}
    ]
)

print(response.choices[0].message.content)
# 输出示例:
# {
#   "translations": [
#     {"chinese": "你好世界", "english": "Hello world"},
#     {"chinese": "很高兴认识你", "english": "Nice to meet you"},
#     {"chinese": "我爱学习编程", "english": "I love learning programming"}
#   ]
# }

示例2: 嵌套JSON结构

response = client.chat.completions.create(
    model="gpt-4-turbo",
    response_format={"type""json_object"},
    messages=[
        {"role""system""content""你是一个返回JSON格式的助手。"},
        {"role""user""content""返回一个公司结构的JSON,包含部门和员工"}
    ]
)

print(response.choices[0].message.content)
# 输出示例:
# {
#   "company": {
#     "name": "Tech Solutions Inc.",
#     "founded": 2010,
#     "departments": [
#       {
#         "name": "Engineering",
#         "head": "Zhang Wei",
#         "employees": [
#           {"id": 101, "name": "李明", "position": "Senior Developer"},
#           {"id": 102, "name": "王芳", "position": "QA Engineer"}
#         ]
#       },
#       {
#         "name": "Marketing",
#         "head": "Sarah Johnson",
#         "employees": [
#           {"id": 201, "name": "刘青", "position": "Marketing Specialist"},
#           {"id": 202, "name": "陈晓", "position": "Content Writer"}
#         ]
#       }
#     ]
#   }
# }

示例3: 强制模型遵循特定JSON模式


def get_structured_data(query, schema):
    system_prompt = f"""
    你必须严格按照以下JSON模式返回数据:
    ```
    {json.dumps(schema, ensure_ascii=False, indent=2)}
    ```
    不要添加任何额外的字段,也不要省略任何必需的字段。
    不要在返回的JSON外包含任何其他文本、解释或注释。
    """

    
    response = client.chat.completions.create(
        model="gpt-4-turbo",
        response_format={"type""json_object"},
        messages=[
            {"role""system""content": system_prompt},
            {"role""user""content": query}
        ]
    )
    
    return response.choices[0].message.content

# 定义一个特定的数据模式
product_schema = {
    "type""object",
    "properties": {
        "products": {
            "type""array",
            "items": {
                "type""object",
                "properties": {
                    "id": {"type""string"},
                    "name": {"type""string"},
                    "price": {"type""number"},
                    "category": {"type""string"},
                    "inStock": {"type""boolean"}
                },
                "required": ["id""name""price""category""inStock"]
            }
        }
    },
    "required": ["products"]
}

result = get_structured_data("生成3个电子产品的详细信息", product_schema)
print(result)
# 输出示例:
# {
#   "products": [
#     {
#       "id": "EP001",
#       "name": "超薄笔记本电脑",
#       "price": 5999.99,
#       "category": "电脑",
#       "inStock": true
#     },
#     {
#       "id": "EP002",
#       "name": "智能手机",
#       "price": 3999.99,
#       "category": "手机",
#       "inStock": true
#     },
#     {
#       "id": "EP003",
#       "name": "无线耳机",
#       "price": 999.99,
#       "category": "音频设备",
#       "inStock": false
#     }
#   ]
# }

使用json_repair修复JSON错误示例

当OpenAI API返回的JSON格式有问题时,可以使用json_repair库修复这些错误。可以看到大部分简单的错误示例是可以直接修复的,有些语义难度大的确实比较难修复。以下是常见的JSON错误及其修复示例:

from json_repair import repair_json, loads
import json
  • 示例1: 修复单引号替代双引号的问题
bad_json1 = "{'name': 'John', 'age': 30, 'city': 'New York'}"
fixed_json1 = repair_json(bad_json1)
print("修复单引号:")
print(f"修复前: {bad_json1}")
print(f"修复后: {fixed_json1}")
print()
  • 示例2: 修复缺少引号的键
bad_json2 = "{name: 'John', age: 30, city: 'New York'}"
fixed_json2 = repair_json(bad_json2)
print("修复缺少引号的键:")
print(f"修复前: {bad_json2}")
print(f"修复后: {fixed_json2}")
print()
  • 示例3: 修复逗号问题
bad_json3 = '{"name": "John", "age": 30, "city": "New York",}'  # 结尾多余的逗号
fixed_json3 = repair_json(bad_json3)
print("修复多余的逗号:")
print(f"修复前: {bad_json3}")
print(f"修复后: {fixed_json3}")
print()
  • 示例4: 修复缺少大括号的问题
bad_json4 = '"name": "John", "age": 30, "city": "New York"' fixed_json4 = repair_json(bad_json4) print("修复缺少括号:") print(f"修复前: {bad_json4}") print(f"修复后: {fixed_json4}") print()

这个直接失败了,没有还原大括号

  • 示例5: 修复非标准的布尔值或空值
bad_json5 = '{"name": "John", "active": True, "data": None}'
fixed_json5 = repair_json(bad_json5)
print("修复非标准的布尔值或空值:")
print(f"修复前: {bad_json5}")
print(f"修复后: {fixed_json5}")
print()
  • 示例6: 修复嵌套结构中的错误
bad_json6 = '{"user": {"name": "John", "contacts": {"email": "john@example.com", phone: "123-456-7890"}}}'
fixed_json6 = repair_json(bad_json6)
print("修复嵌套结构中的错误:")
print(f"修复前: {bad_json6}")
print(f"修复后: {fixed_json6}")
print()
  • 示例7: 修复数组中的错误
bad_json7 = '{"items": [1, 2, 3,, 4, 5]}'  # 数组中有多余的逗号 fixed_json7 = repair_json(bad_json7) print("修复数组中的错误:") print(f"修复前: {bad_json7}") print(f"修复后: {fixed_json7}") print()
  • 示例8: 修复不匹配的括号
bad_json8 = '{"name": "John", "items": [1, 2, 3}'  # 方括号没有闭合
fixed_json8 = repair_json(bad_json8)
print("修复不匹配的括号:")
print(f"修复前: {bad_json8}")
print(f"修复后: {fixed_json8}")
print()

- 示例9: 修复中文等非ASCII字符的问题
```python
bad_json9 = "{'name': '张三', 'city': '北京'}"
fixed_json9 = repair_json(bad_json9, ensure_ascii=False)
print("修复包含中文的JSON并保留中文字符:")
print(f"修复前: {bad_json9}")
print(f"修复后: {fixed_json9}")
print()
  • 示例10: 直接获取Python对象而不是JSON字符串
bad_json10 = "{'name': 'John', 'age': 30, 'skills': ['Python', 'JavaScript']}"
fixed_obj10 = loads(bad_json10)  # 等同于 repair_json(bad_json10, return_objects=True)
print("直接获取Python对象:")
print(f"修复前: {bad_json10}")
print(f"修复后(Python对象): {fixed_obj10}")
print(f"对象类型: {type(fixed_obj10)}")
print()
  • 示例11: 处理严重破损的JSON
severely_broken_json = "{这不是有效的JSON,name: 'John', age: missing_value}"
try:
    fixed_severely_broken = repair_json(severely_broken_json)
    print("修复严重破损的JSON:")
    print(f"修复前: {severely_broken_json}")
    print(f"修复后: {fixed_severely_broken}")
except Exception as e:
    print(f"修复失败: {e}")
print()

这个其实修复失败了,主要是因为前一个字段确实有句话影响比较大,修复难度比较大。

  • 示例12: 处理包含注释的JSON (JSON标准不支持注释)
json_with_comments = """
{
  "name": "John", // 这是用户名
  "age": 30, /* 这是年龄 */
  "city": "New York"
}
"""

fixed_json_comments = repair_json(json_with_comments)
print("修复包含注释的JSON:")
print(f"修复前: {json_with_comments}")
print(f"修复后: {fixed_json_comments}")

还有一个场景,就是我们会经常遇到开头为```json

比如下面:


markdown_json = """```json
{
  "
name": "张三",
  "
age": 30,
  "
skills": ['Python', 'JavaScript', 'React'],
  "
contact": {
    email: "
zhangsan@example.com",
    phone: "
123-456-7890"
  }
}
```"
""

或者

broken_json = """{
  "
products": [
    {"
id": 1, "name": "笔记本电脑", "price": 5999.99},
    {"
id": 2, "name": "智能手机", "price": 3999.99,},
    {"
id": 3, name: "无线耳机", "price": 999.99}
  ],
  "
total_items": 3,
  "
in_stock": True
}"
""

我们可以用下面一个函数来去除前缀和后缀,然后再去修复

def repair_json_output(content: str) -> str:
    """
    Repair and normalize JSON output.

    Args:
        content (str): String content that may contain JSON

    Returns:
        str: Repaired JSON string, or original content if not JSON
    "
""
    content = content.strip()
    if content.startswith(("{""[")) or "```json"in content or "```ts"in content:
        try:
            # If content is wrapped in ```json code block, extract the JSON part
            if content.startswith("```json"):
                content = content.removeprefix("```json")

            if content.startswith("```ts"):
                content = content.removeprefix("```ts")

            if content.endswith("```"):
                content = content.removesuffix("```")

            # Try to repair and parse JSON
            repaired_content = json_repair.loads(content)
            return json.dumps(repaired_content, ensure_ascii=False)
        except Exception as e:
            logger.warning(f"JSON repair failed: {e}")
    return content

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅