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

Dart如何解析OpenAI API返回的非标准JSON格式?

处理OpenAI API流式响应的JSON解析问题

调用OpenAI API获取ChatGPT响应时,返回的是ByteStream。用utf8.decode将字节转成字符串后,会得到带data: 前缀的JSON片段,无法直接传入jsonDecode()解析,示例内容如下:

data: {"id":"chatcmpl-6rcqJGoHnJLz94ZNxcA569JsJSJsR","object":"chat.completion.chunk","created":1678238715,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}

完整的解码后内容是多行类似格式的字符串:

data: {"id":"chatcmpl-6rcqJGoHnJLz94ZNxcA569JsJSJsR","object":"chat.completion.chunk","created":1678238715,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}
data: {"id":"chatcmpl-6rcqJGoHnJLz94ZNxcA569JsJSJsR","object":"chat.completion.chunk","created":1678238715,"model":"gpt-3.5-turbo-0301","choices":[{"delta":{"role":"assistant"},"index":0,"finish_reason":null}]}

解决步骤

  • 将解码后的字符串按行分割,过滤空行和结束标记data: [DONE]
  • 对每一行去除开头的data: 前缀(注意可能存在的空格)
  • 对处理后的纯JSON字符串调用jsonDecode()解析

示例代码(Dart)

import 'dart:convert';

void processOpenAIStream(String decodedStream) {
  List<String> lines = decodedStream.split('\n');
  
  for (String line in lines) {
    String trimmed = line.trim();
    // 跳过空行和结束标记
    if (trimmed.isEmpty || trimmed == 'data: [DONE]') continue;
    // 移除data: 前缀
    String jsonPart = trimmed.replaceFirst(RegExp(r'^data: '), '');
    // 解析JSON
    Map<String, dynamic> chunk = jsonDecode(jsonPart);
    // 按需处理chunk数据,比如提取回复内容
    print(chunk['choices'][0]['delta']);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:25:23