2013-08-22 23 views
2

我目前正试图使用​​流式API从Twitter中传输数据。我附上下面的代码来创建我的NSData并附加到didReceiveData。出于某种原因,每次didReceiveData都会从Twitter获得响应,它会作为新的JSON根添加到NSData中,所以当我试图将NSData解析为JSON结构时,它就会崩溃。Objective-C NSURLConnection didReceiveData在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]; 
} 
+0

比较http://stackoverflow.com/questions/18362889/error-deserializing-json-stream(以及下面的讨论)对于类似的问题。看来NSJSONSerialization无法反序列化多个JSON对象流中的单个JSON对象。 –

+0

你有多个NSURLConnection指向同一个代表吗?你可能会得到不止一个响应。 –

+0

@JamesRichard这是一个流将连接打开并随着时间的推移获得JSON结构,这些结构被附加到NSData中......这是问题的关键。我可以'似乎找到一种方法'将所有接收到的json结构合并为一个'。 – Thomas

回答

1

我想你需要的只是一些额外的逻辑来处理这个实时性。使用你的NSMutableData作为一个容器来继续接收数据,但是在每个批次结束时,你应该扫描所有有效对象的数据对象,构建它们,并将它们存储到一个包含所有构建的json对象的不同对象中。在这个例子让我们假设你有这样的伊娃: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都只有一个单元代表{“一”:“2​​”},并_responseData现在将{ “C”: “5

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

"} 

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

希望有助于一些。我认为你的难题在于确定有多少_responseData被认为是有效的JSON对象。如果它们足够简单,那么可以计算打开的数量{/ [关闭} /]并将该子串拉出。

相关问题