NSJSONSerialization不工作,NSUTF8StringEncoding正在工作

我已经阅读了文档,教程和其他堆栈问答,并挂断了我如何能够使用NSUTF8StringEncoding显示我的JSON ,但不使用NSJSONSerialization – 这是我需要将数据提取到NSDictionaryNSArray 。 我相信这是从我的url返回的NSData格式的问题?

编辑这是错误:错误域= NSCocoaErrorDomain代码= 3840“操作无法完成。(cocoa错误3840.)”(垃圾在结束。)UserInfo = 0x8aabc30

 NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sampleURL.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0]; NSMutableData* responseData = [NSMutableData dataWithCapacity: 0]; - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //this works, and have NSLog below responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"string %@", responseString); [responseData appendData:data]; responseData = [[NSMutableData alloc] initWithData:data]; //this is null in NSLog NSError * error; NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&error]; NSLog(@"jsonDict dict %@",jsonDict); } 

debugging控制台:

  2014-03-11 07:41:58.233 WBPC[7845:a0b] string {"id":"a1","session":"General","name":"Exhibitor Setup Begins","startTime":"0900","details":"9am Exhibitor Hall","png":"image","speaker1":"Johnson","speaker2":"Nelson","speaker3":""}{"id":"b1","session":"General","name":"Conference Registration","startTime":"1000","details":"10am Noon Upper Level Lobby","png":"image","speaker1":"Jackson","speaker2":"","speaker3":""} 2014-03-11 07:41:58.236 WBPC[7845:a0b] jsonDict (null) 

你的JSON格式不正确。 你告诉我们,这是(为了易读性而添加了空格和换行符):

 { "id": "a1", "session": "General", "name": "Exhibitor Setup Begins", "startTime": "0900", "details": "9am Exhibitor Hall", "png": "image", "speaker1": "Johnson", "speaker2": "Nelson", "speaker3": "" }{ "id": "b1", "session": "General", "name": "Conference Registration", "startTime": "1000", "details": "10am Noon Upper Level Lobby", "png": "image", "speaker1": "Jackson", "speaker2": "", "speaker3": "" } 

这是缺less两个字典条目之间的逗号,而你错过了[]应该包装的JSON。 如果它真的是一个字典条目的数组,它应该是:

 [ { "id": "a1", "session": "General", "name": "Exhibitor Setup Begins", "startTime": "0900", "details": "9am Exhibitor Hall", "png": "image", "speaker1": "Johnson", "speaker2": "Nelson", "speaker3": "" }, { "id": "b1", "session": "General", "name": "Conference Registration", "startTime": "1000", "details": "10am Noon Upper Level Lobby", "png": "image", "speaker1": "Jackson", "speaker2": "", "speaker3": "" } ] 

如果你想检查你的JSON,你可以访问http://jsonlint.com 。 另外,如果你检查了JSONObjectWithData返回的error对象,它会指出你在正确的方向。

你应该看看这个JSON是如何生成的。 看起来它一定是手动生成的。 例如,如果您是从PHP页面生成的,则应该使用json_encode ,而不是手动生成JSON。


顺便说一句,你正试图parsingdidReceiveData的结果。 你不应该尝试parsing,直到connectionDidFinishLoading 。 您的didReceiveData应该只是将data附加到您的NSMutableData对象。 parsing应该推迟到connectionDidFinishLoading

你在'didReceiveData'委托函数中做的不是正确的地方。 唯一应该在那里的是:

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [self.responseData appendData:data]; } 

但在此之前,您应该在连接收到响应时初始化“self.responseData”:

 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { if(self.responseData != nil) self.responseData = nil; self.responseData = [[NSMutableData alloc] init]; } 

然后,您需要实现另一个名为“connectionDidFinishLoading”的委托函数,并且在调用此方法时,您的“responseData”将包含来自JSON的所有数据,并将准备好parsing:

 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding]; NSLog(@"string %@", responseString); NSError * error; NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&error]; NSLog(@"jsonDict dict %@",jsonDict); } 

我希望能以某种方式帮助。

嗨,你可以试试这个。

 NSError *error = nil; NSArray *jsonResponseArray = [NSJSONSerialization JSONObjectWithData: YOURDATA options: NSJSONReadingMutableContainers error: &error]; if (!jsonResponseArray) { NSLog(@"Error: %@", error); } else { for(NSDictionary *dic in jsonResponseArray) { NSLog(@"dic values are : %@", item); } } 

谢谢

您发布的JSONstring不是有效的JSON。 仅仅因为数据是一个有效的UTF8string并不意味着它必然是JSON。 尝试从被debugging的string粘贴到JSONLint中 ,它会告诉你,你的JSON对象之间缺less一个逗号。