2013-10-09 59 views
1

请帮我调试代码无法识别的选择发送到实例在JSON解析

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 
    NSError *error = nil; 
    NSURL *urls = [NSURL URLWithString:[NSString stringWithFormat:@"http://cnapi.iconnectgroup.com/api/UserProfile?id=1"]]; 
    NSString *json = [NSString stringWithContentsOfURL:urls encoding:NSASCIIStringEncoding error:&error]; 
     NSLog(@"JSon data = %@ and Error = %@", json, error); 
    if(!error) 
    { 
     NSData *jsonData = [json dataUsingEncoding:NSASCIIStringEncoding]; 
     NSArray *myJsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
     NSLog(@"JSON data is :: %@", myJsonArray); 

     for(NSDictionary *jsonDictionary in myJsonArray) 
     { 
      //NSString *uids = jsonDictionary[@"UID"]; 
      NSString *address1 = jsonDictionary[@"Address1"]; 
      NSString *address2 = jsonDictionary[@"Address2"]; 
      NSString *city = jsonDictionary[@"City"]; 
      NSString *emailId = jsonDictionary[@"EmailID"]; 
      NSString *fname = jsonDictionary[@"FName"]; 
      NSString *fax = jsonDictionary[@"Fax"]; 
      NSString *lname = jsonDictionary[@"LName"]; 
      NSString *password = jsonDictionary[@"Password"]; 
      NSString *phone = jsonDictionary[@"Phone"]; 
      NSString *state = jsonDictionary[@"State"]; 
      NSString *uids = [jsonDictionary objectForKey:@"UID"]; 
      NSString *zip = jsonDictionary[@"Zip"]; 
      NSString *company = jsonDictionary[@"company"]; 
      NSString *department = jsonDictionary[@"department"]; 

      NSLog(@"Uid is = %@", uids); 
      NSLog(@"First Name = %@", fname); 
      NSLog(@"Last Name = %@", lname); 
      NSLog(@"Company = %@", company); 
      NSLog(@"Email Id = %@", emailId); 
      NSLog(@"Password = %@", password); 
      NSLog(@"Department = %@", department); 
      NSLog(@"Address 1 = %@", address1); 
      NSLog(@"Address 2 = %@", address2); 
      NSLog(@"City = %@", city); 
      NSLog(@"State = %@", state); 
      NSLog(@"Zip = %@", zip); 
      NSLog(@"Phone = %@", phone); 
      NSLog(@"Fax = %@", fax); 

     } 
    } 

    }); 
    [activity stopAnimating]; 
    self.activity.hidden = YES; 
} 

图片会给你错误所在。点击stepover进行调试后出现此错误。我也试过

NSString *address1 = [jsonDictionary objectForKey:@"Address1"]; 

enter image description here

+1

当你记录myJsonArray的内容时,你在控制台上看到了什么? –

+0

你确定jsonDictionary是一个NSDictionary,我认为它是一个字符串 –

+0

显示你的myJsonArray – wesley

回答

2

从url的输出中,它显示它不是数组而是字典。你正试图在这里转换为数组。

NSArray *myJsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 

改用此

NSDictionary *myJsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 

然后删除for循环不需要它。并用myJsonDictionary替换你的变量jsonDictionary,以便检索值。

// for(NSDictionary *jsonDictionary in myJsonArray) 

现在运行它会没事的。为我工作得很好

如果输出是字典数组,它会看起来像这样用方括号括起来。

For Ex: [{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}] 

如果你不知道从URL响应的性质,你可以检查 类型。对于前:

id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 

if ([jsonObject isKindOfClass:[NSArray class]]) { 
    NSLog(@"its an array!"); 

    NSArray *myJsonArray = (NSArray *)jsonObject; 
    // Handle Array of Dictionary 

for(NSDictionary *jsonDictionary in myJsonArray) 
    { 
     NSString *address1 = jsonDictionary[@"Address1"]; 
     //and so on 
    } 
} 
else { 
NSLog(@"It's Dictionary"); 
NSDictionary *jsonDictionary = (NSDictionary *)jsonObject; 
NSLog(@"jsonDictionary - %@",jsonDictionary); 
//Handle NSDictionary 
} 
1

jsonDictonary是一个的NSString不像你想象NSDictonary。

仔细检查你的JSON,也许在调用该函数之前检查它是否是NSDictonary。

+0

如果我用NSString代替NSDicationary for lop,我得到了多个编译时错误,指出“期望的方法读取字典元素在'NSString *'类型的对象上找不到' –

+0

@DeepakThakur - 实际上*在你的JSON和*理解*它的意思,然后塑造代码来匹配。不要从其他地方复制代码,只是试图破解它,直到它工作。 JSON非常简单*如果你只是尝试首先理解它。请参阅json.org。 –

0

你应该使用半标准框架的一个解析JSON到核心数据。有一些关于这些问题的SO问题。

在这种情况下,您的JSON只有一个不是数组的对象。 一般而言,如果服务器发送了意外事件,应用程序不应该中止,因此最好使用解析器,它将大声抱怨格式错误的JSON,而不是从头开始。

相关问题