前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenAI API JSON 格式指南与json_repair错误修复

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

作者头像
致Great
发布于 2025-05-11 12:51:03
发布于 2025-05-11 12:51:03
23800
代码可运行
举报
文章被收录于专栏:自然语言处理自然语言处理
运行总次数:0
代码可运行

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

指定OpenAI API返回JSON格式

基本JSON格式响应示例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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"]
# }
更复杂的结构化数据请求
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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响应
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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格式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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结构
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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错误及其修复示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from json_repair import repair_json, loads
import json
  • 示例1: 修复单引号替代双引号的问题
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复缺少引号的键
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复逗号问题
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复缺少大括号的问题
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复非标准的布尔值或空值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复嵌套结构中的错误
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复数组中的错误
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 修复不匹配的括号
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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字符串
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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标准不支持注释)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

比如下面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
markdown_json = """```json
{
  "name": "张三",
  "age": 30,
  "skills": ['Python', 'JavaScript', 'React'],
  "contact": {
    email: "zhangsan@example.com",
    phone: "123-456-7890"
  }
}
```"""

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}"""

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
调试 .NET Core 中的内存泄漏
当应用引用不再需要执行所需任务的对象时,可能会发生内存泄漏。 引用上述对象会使垃圾回收器无法回收所使用的内存,这通常会导致性能降低,并可能最终引发 OutOfMemoryException。
呆呆
2022/01/09
1.9K0
.NET周刊【5月第4期 2025-05-25】
https://www.cnblogs.com/hez2010/p/18889954/the-new-satori-gc-for-dotnet
InCerry
2025/06/09
200
.NET周刊【5月第4期 2025-05-25】
浅入 .NET Core 中的内存和GC知识
【1】https://docs.microsoft.com/zh-cn/dotnet/standard/managed-code
痴者工良
2021/04/26
7320
《快来为你的 .NET 应用加个监控吧!》更新版本啦
CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC、CPU、内存、机器网络、磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafana 显示。
痴者工良
2021/07/20
5290
《快来为你的 .NET 应用加个监控吧!》更新版本啦
.NET Core 调试 CPU 爆高问题
在实际开发和生产环境中,.NET Core 应用程序遇到 CPU 使用率飙升的问题并不少见。CPU 高负载会直接影响应用程序的性能,进而影响用户体验。因此,及时识别并解决 CPU 爆高问题是开发者需要掌握的关键技能。
Michel_Rolle
2024/12/24
2.3K0
调试 .NET Core 中的高 CPU 使用率
本教程将介绍如何调试 CPU 使用率过高的情况。 使用提供的示例 ASP.NET Core Web 应用 源代码存储库,可以故意造成死锁。 终结点将停止响应并遇到线程累积问题。 你将了解如何使用各种工具,通过几条关键的诊断数据诊断此情况。
呆呆
2022/01/09
1.4K0
.NET 9 中的 RuntimeMetrics
.NET 9 中引入了 RuntimeMetrics,基于 dotnet 里的 metrics 实现 System.Diagnostic.Metrics.Meter 来生成 metrics 数据,包含了 CPU、内存、GC、JIT 以及线程等信息
JusterZhu
2025/01/23
630
.NET 9 中的 RuntimeMetrics
收集指标
本文适用范围:✔️ .NET Core 3.1 及更高版本 ✔️ .NET Framework 4.6.1 及更高版本
呆呆
2022/01/07
6620
记一次 .NET 某风控管理系统 内存泄漏分析
上个月中旬,星球里的一位朋友在微信找我,说他的程序跑着跑着内存会不断的缓慢增长并无法释放,寻求如何解决 ?
玖柒的小窝
2021/11/02
5200
记一次 .NET 某风控管理系统 内存泄漏分析
讨论.NET Core 配置对GC 工作模式与内存的影响
https://mp.weixin.qq.com/s/PqhUzvFpzopU7rVRgdy7eg
yoyofx
2018/09/05
3.4K1
使用dotnet-monitor sidecar模式 dump docker运行的dotnet程序.
随着容器和云技术的发展, 大量的应用运行在云上的容器中, 它们的好处是毋庸置疑的, 例如极大的提高了我们的研发部署速度, 快速的扩缩容等等, 但是也存在一些小小的问题, 例如难以调试. 基于VM的部署我们可以通过安全的方式登录到主机上做一些你想做的事情, 但是云上的容器那就是不太方便了(目前AWS的ECS已经有类似docker exec的方式直接进入容器中了, 其他的云未作了解). 但是就算能进入容器也不意味着调试就好做了, 通常来说使用的镜像都是经过优化和精简的(如果要调式可能需要安装大量的组件).
旺财的城堡
2022/11/02
1.3K0
使用dotnet-monitor sidecar模式 dump docker运行的dotnet程序.
一次完整的JVM堆外内存泄漏故障排查记录
记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些「JVM内存分配的原理分析」以及「常用的JVM问题排查手段和工具分享」,希望对大家有所帮助。
Rude3Knife的公众号
2020/08/28
4K0
一次完整的JVM堆外内存泄漏故障排查记录
Linux命令-查看内存、GC情况及jmap 用法
首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id
chenchenchen
2020/05/27
12.3K0
详解 Java 线上问题排查思路
因为通常线程数量会由线程池管理,一般不会超过我们设定的最大值;而线程“死锁”通常是人为代码问题,某个获得锁的线程没有释放锁,导致其他线程一直处于 Waiting 状态(或者 CAS 自旋状态)。
宫水三叶的刷题日记
2021/03/02
3.5K0
详解 Java 线上问题排查思路
记一次内存溢出问题的排查、分析过程及解决思路
这个测试工具的开发已有一段时间了,由于数据量过大,写入数据较慢,导致工具执行耗时较长,所以再次优化了实现方案,进行二阶段的程序开发。
软件测试君
2020/09/23
2.6K0
记一次内存溢出问题的排查、分析过程及解决思路
记一次敖丙dubbo线程池事故排查
我写过dubbo系列的文章,大家看完这章后想了解更多dubbo细节可以查看往起文章:
敖丙
2021/04/16
1.1K0
记一次敖丙dubbo线程池事故排查
【日活百万电商返利App】一次线上JVM问题定位排查
查看进程使用gc情况: jstat -gc 16969<pid> 5000(打印时间间隔)
用户2032165
2020/03/27
9680
【日活百万电商返利App】一次线上JVM问题定位排查
ASP.NET Core 性能优化最佳实践
本文提供了 ASP.NET Core 的性能最佳实践指南。 译文原文地址:https://docs.microsoft.com/en-us/aspnet/core/performance/perfor
newbe36524
2020/09/14
2.7K0
ASP.NET Core 性能优化最佳实践
架构师技能3-彻底深入理解和分析Java中内存溢出OutOfMemoryError
java开发人员经常遇到OutOfMemoryError的问题。要解决这些问题,要有对java虚拟机的内存管理有一定的认识,甚至对linux系统也要有一定的熟悉。透过分析问题,深入挖掘问题本质,进而强迫自己学习相应基础知识。
黄规速
2022/04/14
4820
架构师技能3-彻底深入理解和分析Java中内存溢出OutOfMemoryError
体验了一把线上CPU100%及应用OOM的排查和解决过程
项目中默认使用 spring-cloud-sleuth-zipkin 依赖得到 zipkin-reporter。分析的版本发现是 zipkin-reporter版本是 2.7.3 。
全栈程序员站长
2022/07/20
5230
体验了一把线上CPU100%及应用OOM的排查和解决过程
推荐阅读
相关推荐
调试 .NET Core 中的内存泄漏
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 指定OpenAI API返回JSON格式
    • 基本JSON格式响应示例
    • 更复杂的结构化数据请求
    • 使用函数调用确保JSON响应
  • 处理特定场景的JSON返回格式
    • 示例1: 中文内容的JSON格式
    • 示例2: 嵌套JSON结构
    • 示例3: 强制模型遵循特定JSON模式
  • 使用json_repair修复JSON错误示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档