我正在为我正在编写的应用程序而苦苦挣扎。在应用程序方面,我有一个NSInputStream,它通过CFStreamCreatePairWithSocketToHost连接到服务器。

服务器正在以与应用程序异步的方式生成JSON对象。

在应用程序中,我对事件NSStreamEventHasBytesAvailable上的网络数据使用react。在某些网络上,我会在网络缓冲区中收到多个JSON对象。但是,我也要注意在一个网络缓冲区中没有收到整个JSON对象的情况。

我一直在寻找可以为我处理这些情况的JSON解析器,但一直找不到。 NSJSONSerialization无法很好地应对要传递的NSData中的多个JSON对象。我无法掌握如何在流上运行NSJSONSerialization的方法,并且不确定是否可以解决我的问题。

我已经研究了YAJL,但我只能使它工作不止一次。对于我所遇到的情况,我似乎找不到任何好的例子。

我感到沮丧和困惑,什么是最好的方法?在哪里可以找到一个好的榜样?欢迎任何建议!

最佳答案

有一个名为SBJson的库

这是一个示例(from here):

- (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;
    }
}

关于ios - 在iOS中解析连续JSON流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29440325/

10-12 00:04
查看更多