0

我正在尝试解码从 Twitter 的 Streaming API 发送到我的应用程序的 json。

Twitter 将发送我的客户数据,其结构如下:

流式 API 响应的主体由一系列以换行符分隔的消息组成,其中“换行”被认为是 \r\n(十六进制,0x0D 0x0A),“消息”是 JSON 编码的数据结构或空行.

他们基本上用 \r\n 分隔推文。有时他们会向您发送一条推文,有时他们会一次向您发送许多推文。

解码“许多”案例对我来说是有问题的。我使用 iOS 内置的 NSJSONSerialization 类。问题是它读取了第一条推文,然后看到了 \r\n 并将其视为垃圾并返回一个空数组和伴随的错误。

为了解决这个问题,我使用以下代码基本上删除了换行符。

// json is the received json data
    NSString* responseString = [[NSString alloc] initWithData:json encoding:NSASCIIStringEncoding];

    NSMutableArray* responseMutableArray = [[responseString componentsSeparatedByString:@"\r\n"] mutableCopy];
    [responseMutableArray removeLastObject];

    NSArray* responseArray = [NSArray arrayWithArray:responseMutableArray];
    [responseMutableArray removeAllObjects];

    NSError* error;

    for(NSString* tweetString in responseArray)
    {
        NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:[tweetString dataUsingEncoding:NSUTF8StringEncoding] options: NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:&error];
        [responseMutableArray addObject:dict];
    }
 //responseMutableArray contains the parsed tweets

方法是,将数据转换为 NSString,将 NSString 转换为数组(通过 \r\n 拆分),数组返回数据,然后将 JSON 解析为字典。这是一个混乱的过程,我想知道是否有更有效的方法可以做到这一点。

非常感谢

维生素B

4

3 回答 3

0

试试这个:

NSString *string = [[NSString alloc] initWithData:json encoding:NSASCIIStringEncoding]:
string = [NSString stringWithFormat:@"[%@]", [string stringByReplacingOccurrencesOfString:@"\\r\\n" withString:@","]];
NSArray *array= [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments|NSJSONReadingMutableContainers error:&error];
于 2013-03-17T09:12:25.577 回答
0

触摸这个:

let stringData = String(data: data, encoding: NSUTF8StringEncoding)
if let strData = stringData {
    let newString = strData.stringByReplacingOccurrencesOfString("\r\n", withString: "\\r\\n")
    if let newString = newString {
        do  {
            let dict:[AnyObject] = try NSJSONSerialization.JSONObjectWithData(newString.dataUsingEncoding(NSUTF8StringEncoding)!, options: [.AllowFragments, .MutableContainers]) as! [AnyObject]
        }catch let e as NSError {
            print(e.description)
        }  
    } 
}
于 2016-08-31T11:44:43.823 回答
0

免责声明:我实际上是通过自己遇到这个问题来到这里的。

我认为最简单的解决方案是修改@Elmundo 的答案,完全删除换行符。它对我有用。

注意:这是 Swift 版本 3.something

guard var string = String(data: data, encoding: .utf8) else {
    return
}

string = string.stringByReplacingOccurrencesOfString("\r\n", withString: "")

guard let data = string.data(using: .utf8) else {
    return false
}

do  {
    let json = try NSJSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String:Any]
}catch let e as NSError {
    print(e.description)
}  
于 2017-07-17T05:37:02.783 回答