gpt4 book ai didi

ios - Objective-C NSURLConnection didReceiveData在NSData中创建错误的JSON

转载 作者:行者123 更新时间:2023-12-01 16:48:05 25 4
gpt4 key购买 nike

我目前正在尝试使用其流API来从Twitter流数据。我已经附加了以下代码,用于创建NSData并将其附加到didReceiveData上。出于某种原因,每次didReceiveData从Twitter获得响应时,它都会作为新的JSON根附加到NSData中,因此当我尝试将NSData解析为JSON结构时,它会崩溃。

我不知道发生了什么,并将JSON发布到验证器中,它指出JSON中有多个根。如何修改代码以继续追加到现有JSON根目录?还是当NSData中有多个JSON条目时,是否有一种更简单的方法来反序列化为JSON?

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
// A response has been received, this is where we initialize the instance var you created
// so that we can append data to it in the didReceiveData method
// Furthermore, this method is called each time there is a redirect so reinitializing it
// also serves to clear it
NSLog(@"Did receive response");
_responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// Append the new data to the instance variable you declared
NSLog(@"Did Receive data");
[_responseData appendData:data];
}

最佳答案

我认为您需要的只是一些额外的逻辑来处理这种实时性。使用NSMutableData作为容器来继续接收数据,但是在每批处理结束时,您应该在数据对象中扫描所有有效对象,对其进行构建,然后将它们存储到包含所有已构建json对象的其他对象中。在此示例中,假定您具有此ivar:NSMutableArray * _wholeObjects

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
// Append the new data to the instance variable you declared
NSLog(@"Did Receive data");
[_responseData appendData:data];
[self buildWholeObjects]
}

- (void) buildWholeObjects {
NSArray *rootObjects = <#business logic to return one whole JSON object per array element, or return nil if none found#>
if (rootObjects != nil) {
NSUInteger bytesExtracted = 0;
for (rootObject in rootObjects) {
[_wholeObjects addElement:rootObject];
bytesExtracted += rootObject.length;
}
NSData *remainingData = [_responseData subdataWithRange:NSMakeRange(bytesExtracted, _responseData.length - bytesExtracted];
[_responseData setData:remainingData];
}
}

完成此操作后,仅访问_wholeObjects中的对象,其中每个元素代表一个完全有效的JSON对象,您可以根据需要对其进行反序列化或读取。

为了清楚起见,可以说第一个NSData表示:
{"a":"2"}{"c":"5

当您处理它时,_wholeObjects将有一个表示{“a”:“2”}的元素,而_responseData现在将是{“c”:“5

然后,下一个数据流应在对象上继续。可以说第二个NSData是:
"}

现在_responseData为{“c”:“5”},因为我们将新消息附加到剩余的旧消息上。我们将其构建出来,并在_wholeObjects中获得第二个元素,并且_responseData将为空并准备接收下一组数据。

希望对您有所帮助。我认为对您来说最困难的部分是确定多少_responseData被视为有效的JSON对象。如果它们足够简单,则只需计算打开{/ [到结束} /]的数量,然后将该子字符串拉出即可。

关于ios - Objective-C NSURLConnection didReceiveData在NSData中创建错误的JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18391480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com