我正在尝试解码从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的
答案 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)
}