关于iOS原生、小程序流式数据解析数据丢失的问题

最近在做AI相关的需求,在H5及Web端流式数据的请求和解析并没有遇到问题,但是在同步做小程序和iOS的时候数据解析遇到了很多问题,例如数据不完整,解析保存,数据丢失等。

首先流式数据在小程序和iOS上的其实的分段回来的数据,以下例举几个特殊的数据

id:message_ack

data:

{"content":"风流","message":null,"think":null}

id:message_ack

data:{"content":"风流","message":null,

"think":null}

在打印line时会发现每一行不是一个完整的数据,服务器在返回数据时由于分包的原因,数据会被拆分,导致前台接收到的数据不完整,所以需要前台单独处理

// 维护一个全局 buffer,保证 JSON 数据完整性
					if (!that.buffer) that.buffer = '';
					var str = that.buffer
					for (let i = 0; i < lines.length; i++) {
						let line = lines[i].trim(); // 去掉前后空格
						str += line
					}
					let matches = [...str.matchAll(/id:\s*(.*?)\s*data:\s*(\{.*?\})(?=\s*id:|\s*$)/gs)];
					if (matches.length > 0) {
					    for (let match of matches) {
					        let idValue = match[1].trim(); // 提取 id 值
					        let jsonString = match[2]; // 提取 JSON 部分
					
					        try {
										console.log(jsonString)
					            let temp = JSON.parse(jsonString);
					            temp.contentType = "text";
					            event.typeId = idValue; // 记录 id
					            event.data = JSON.stringify(temp);
					            that.streamOutput(event);
					        } catch (e) {
					            // console.error("JSON 解析失败:", e);
					        }
					    }
					}else{
						that.buffer = str
					}

以js代码为例,每一组lines也不一定是一个完整的id:***data:***所以要使用buffer去追加,凑成一个完整的jsonstring,最后再去解析拼接出来的字符串

以下为oc代码

NSError *error = nil;
    // 正则表达式
    NSString *pattern = @"id:\\s*(.*?)\\s*data:\\s*(\\{.*?\\})(?=\\s*id:|\\s*$)";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionDotMatchesLineSeparators error:&error];
    
    if (error) {
        NSLog(@"正则表达式创建失败: %@", error);
        return;
    }

    // 查找所有匹配项
    NSArray *matches = [regex matchesInString:str options:0 range:NSMakeRange(0, str.length)];
        
    if (matches.count > 0) {
        for (NSTextCheckingResult *match in matches) {
                    // 提取 id 值
                    NSRange idRange = [match rangeAtIndex:1];
            NSString *idValue = [[str substringWithRange:idRange] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
                    
            // 提取 JSON 部分
            NSRange jsonRange = [match rangeAtIndex:2];
            NSString *jsonString = [str substringWithRange:jsonRange];

            NSError *jsonError = nil;
            // 解析 JSON 字符串
            NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
            NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&jsonError];
            
            if (jsonError) {
                NSLog(@"JSON 解析失败: %@", jsonError);
                continue;
            }
            
            // 构建 event 字典(类似你的 event 对象)
            NSMutableDictionary *event = [NSMutableDictionary dictionary];
            event[@"data"] = [NSJSONSerialization JSONObjectWithData:[NSJSONSerialization dataWithJSONObject:[jsonObject mutableCopy] options:0 error:nil] options:0 error:nil];
            self.tempStr = @"";
            [self.delegate didReceiveSSEEvent:idValue data:event[@"data"]];

        }
    }else{
        self.tempStr = str;
    }

此篇文章仅供参考,具体的需求场景还需要自己去处理

你可能感兴趣的:(微信小程序,objective-c)