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
        }
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值