NSJSONSerialization不工作,NSUTF8StringEncoding正在工作
我已经阅读了文档,教程和其他堆栈问答,并挂断了我如何能够使用NSUTF8StringEncoding
显示我的JSON
,但不使用NSJSONSerialization
– 这是我需要将数据提取到NSDictionary
或NSArray
。 我相信这是从我的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一个逗号。