Android中处理流式数据切割
通过测试发现获取到的流式数据内部含有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}}