我已经阅读了文档、教程和其他Stack Q&A,并且不知道如何让我的JSON使用NSUTF8StringEncoding出现,而不是使用NSJSONSerialization --这正是我需要将数据提取到NSDictionary或NSArray中所需要的。我相信这是一个问题,NSData的格式是从我的网址返回?
编辑这里是错误:错误Domain=NSCocoaErrorDomain Code=3840“操作无法完成。(可可错误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);
}调试控制台:
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)发布于 2014-03-11 14:08:45
您的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的[和]。如果它确实是一组字典条目,那么应该是:
[
{
"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。另外,如果您检查了由error返回的JSONObjectWithData对象,它将指出正确的方向。
您应该看看JSON是如何生成的。它看起来一定是手动生成的。例如,如果您是从PHP页面生成这个JSON,则应该使用json_encode,而不是手动生成JSON。
顺便说一句,您正在尝试在didReceiveData中解析结果。在connectionDidFinishLoading之前,您不应该尝试解析。您的didReceiveData只应该将data附加到NSMutableData对象。解析应该推迟到connectionDidFinishLoading。
发布于 2014-03-11 12:57:57
所有这些都是在'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的所有数据,并准备解析:
-(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);
}我希望这能在某种程度上有所帮助。
发布于 2014-03-11 13:00:36
嗨你可以试试这个。
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);
}
}谢谢
https://stackoverflow.com/questions/22326273
复制相似问题