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
相关产品推荐
相关产品推荐

