iOS中的JSON处理:删除换行符

时间:2013-03-17 06:04:20

标签: ios json twitter

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

Twitter将发送具有以下结构的客户数据:

  

流API响应的主体由一系列换行符分隔的消息组成,其中“newline”被认为是\ r \ n(十六进制,0x0D 0x0A),“message”是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解析为字典。这是一个混乱的过程,我想知道是否有更有效的方法可以做到这一点。

非常感谢

Vb的

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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)
        }  
    } 
}

答案 2 :(得分: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)
}