2011-11-02 51 views
2

我試圖爲id檢索值提取值時:NSInvalidArgumentException利用JSON數據

{"id":1,"name":"XYZ"} 

當我使用:

NSString *jsonData = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url]]; 
NSArray * myPeople = [jsonData JSONValue]; 

NSString *name = [[NSString alloc] init]; 
NSDictionary *person = [myPeople objectAtIndex:[indexPath row]]; 
name = [NSString stringWithString:[person valueForKey:@"id"]]; 
name = [name stringByAppendingString:@". "]; 
name = [name stringByAppendingString:[person valueForKey:@"name"]]; 
name = [name stringByAppendingString:[person valueForKey:@"id"]]; 

cell.textLabel.text = name; 

我收到以下錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException' 
reason: '-[NSCFNumber length]: unrecognized selector sent to instance 0x4e7f8b0 

我該如何解決這個問題?

+1

建議:不要寫成「請幫幫忙」,張貼編譯器錯誤的文本。 – jlehr

+1

我沒有使用您使用的JSON庫,但您提供的代碼看起來沒問題。例外說''長度'正在'NSNumber'上調用,你能顯示其餘的代碼嗎? –

+0

這不是一個編譯器錯誤。至少你需要了解編譯時間和運行時間之間的差異。 –

回答

8

要調用都stringWithString:stringByAppendingString:但隨後傳遞一個NSNumber

你需要得到的NSNumber

[[person valueForKey:@"id"] stringValue]; 

字符串值或使用的格式,如:

name = [NSString stringWithFormat:@"%@%@", name, [person valueForKey:@"id"]]; 

我也會考慮稍微改變一下這個結構,使它更容易按照如下方式進行操作:

NSDictionary *person = [myPeople objectAtIndex:[indexPath row]]; 
NSString *personName = [person valueForKey:@"name"]; 
NSSNumber *personId = [person valueForKey:@"id"]; 

NSString *name = [NSString stringWithFormat:@"%@. %@ %@", personId, personName, personId]; 

對於排序,您希望確保每次設置單元格時都不要拖動該數據(看起來像是),否則將會是非常糟糕的體驗。

我敢肯定有人能指出你整理一個更好的辦法,但我能想到的最快的是

NSArray *myPeople = [[jsonData JSONValue] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [[obj1 objectForKey:@"id"] compare:[obj2 objectForKey:@"id"]]; 
}] 
+0

謝謝你的工作! :) – iDev

+0

我有另一個查詢,我從URL獲得的JSON數據是: [{「id」:1,「name」:「XYZ」},{「id」:3,「name」:「PQR 「},{」 ID 「:2,」 名 「:」 ABC「}。我想將它們顯示在單元格中,以表格的形式顯示在亞洲的ID上。你可以請指導我 – iDev

+0

這是非常有幫助的! :)真的很感謝你的幫助 – iDev