通过测试发现获取到的流式数据内部含有data:所以需要进一步处理,不能仅用.split("data:")分割数据
流式json数据
data: {
"code": 0,
"message": "",
"data": {
"type": 1,
"question": null,
"answerOrigin": "<think>\n首先,用户要求我根据提供的“数据内容”和“文档背景”生成一份简练、精准的中文总结。总结应基于数据内容的核心信息,并结合文档背景提升完整性。输出应直接聚焦于内容本身,无需提及任何过程或字段名称。\n\n现在,回顾数据内容:\n- 数据内容是一个JSON对象,包含:\n - \"code\": 200(表示成功)\n - \"msg\": \"success chat\"\n - \"questio\": \"健康申报范围是什么\"\n - \"response\": \"data:</think>",
"answerRead": null,
"blueprintAddr": null,
"deviceLocation": null,
"id": "69e39960-f5e8-41ab-9d0b-2fd4906b188f",
"sessionId": "a320403e8de311f0aad90242c0a82002",
"isEnd": false
}
}
如果仅通过val result = line!!.split("data:") 切割流式数据会报error : org.json.JSONException: Unterminated string at character 是因为json数据中answerOrigin字段内数据含有data: 所以会导致切割出来的前边string没有结束字符 " 会报异常,所以需要使用以下方法处理获取到的流式数据
kotlin代码
fun parseSSEStream(rawInput: String): JSONObject {
// 累积所有 data: 后面的内容
val dataContent = StringBuilder()
// 按行分割(假设每行是一个 data: ...)
rawInput
.replace("\r\n", "\n")
.splitToSequence("\n")
.map { it.trim() }
.filter { it.startsWith("data:") }
.forEach { line ->
// 提取 data: 后面的内容
val jsonPart = line.substringAfter("data:", "").trim()
dataContent.append(jsonPart)
}
val fullJson = dataContent.toString().trim()
if (fullJson.isEmpty()) {
throw IllegalArgumentException("No data content found")
}
// 使用 JSONTokener 可以容忍部分格式问题(比 JSONObject.parse 更健壮)
return try {
val tokener = JSONTokener(fullJson)
JSONObject(tokener)
} catch (e: Exception) {
println("Final JSON: $fullJson") // 调试输出
throw e
}
}
20

被折叠的 条评论
为什么被折叠?



