我正在努力掌握我正在编写的应用程序的 JSON 技巧。在应用程序端,我有一个 NSInputStream,它通过 CFStreamCreatePairWithSocketToHost 连接到服务器。
服务器正在以异步方式为应用程序生成 JSON 对象。
在应用程序中,我对 NSStreamEventHasBytesAvailable 事件上的网络数据做出反应。在某些网络上,我发现网络缓冲区中收到了多个 JSON 对象。但我还想处理在一个网络缓冲区中没有收到整个 JSON 对象的情况。
我一直在寻找一个可以为我处理这些场景的 JSON 解析器,但一直没能找到。 NSJSONSerialization 不能很好地处理要传递的 NSData 中的多个 JSON 对象。我无法掌握如何让 NSJSONSerialization 在流上工作,并且不确定它是否能解决我的问题。
我研究过 YAJL 但我只能让它工作不止一次。我似乎找不到任何适合我的场景的好例子。
我感到沮丧和困惑什么是最好的方法以及在哪里可以找到一个很好的例子?欢迎任何建议!
有一个图书馆叫SBJson https://github.com/stig/json-framework
这是一个例子(从这里 https://github.com/stig/ChunkedDelivery/blob/master/ChunkedDelivery/SBViewController.m):
- (IBAction)go {
id block = ^(id item, BOOL *stop) {
dispatch_async(dispatch_get_main_queue(), ^{
// do something with item
});
};
id eh = ^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
// handle error
});
};
self.parser = [SBJson4Parser unwrapRootArrayParserWithBlock:block
errorHandler:errorHandler];
NSURLSessionConfiguration *c = [NSURLSessionConfiguration defaultSessionConfiguration]
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:c
delegate:self
delegateQueue:nil];
NSURL *url = [NSURL URLWithString:self.urlField.text];
NSURLSessionDataTask *urlSessionDataTask = [urlSession dataTaskWithURL:url];
[urlSessionDataTask resume];
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data {
switch ([self.parser parse:data]) {
case SBJson4ParserError:
self.parser = nil;
break;
case SBJson4ParserComplete:
case SBJson4ParserStopped:
self.parser = nil;
break;
case SBJson4ParserWaitingForData:
break;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)