2012-07-31 208 views
-1

我正在嘗試爲iOS編寫一個Facebook Feed應用程序,並且我試圖使用JSON框架,效果很差。每當我運行我的代碼,我得到錯誤「*由於未捕獲的異常'NSInvalidArgumentException'終止應用程序,原因:'數據參數爲零'」。我使用Flickr的饋送作爲測試/演示網址,因爲Facebook網址是使用訪問令牌請求和appendToString:以編程方式創建的。JSON數據未被填充

NSURL *url2 = [NSURL URLWithString:@"www.flickr.com/services/feeds 
        /photos_public.gne?tags=punctuation&someKey=atsign&format=json"]; 
    NSError *error = nil; 
    NSData *data = [NSData dataWithContentsOfURL:url2]; 
    if (data == nil){ 
     NSLog(@"data is nil"); 
    } 
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data 
                 options:NSJSONReadingMutableContainers 
                  error:nil]; 
    NSLog(@"json: %@\n\n Or Error: %@", json, [error localizedDescription]); 

編輯:我改變了在我的代碼,包括錯誤和NSLog的,並且改變了URL(在海報ILIS的意見),以及if語句來測試,如果數據是零(添加感謝海報達斯汀的想法)。現在我從NSLog得到一個輸出,它聲明「json:(null)或錯誤:操作無法完成(可可錯誤3840.)」,並且if語句沒有響應。所以我認爲當NSDictionary json被創建時,問題就出現了。

+0

而非NSDictionary的嘗試ID一次,看看結果 – ilhnctn 2012-07-31 17:59:35

+0

我改變JSON來標識和的NSLog仍顯示JSON作爲(空)。 – Chance 2012-07-31 19:57:28

回答

0

我發現在計算器上答案:NSJSONSerialization

原來,Flickr的JSON供稿格式不正確,因此數據中填充了前綴無法通過NSJSONSerialization處理的信息。

1

您的網址被錯誤地創建。當您撥打dataWithContentsOfURL的網址無效時,您會收到nilNSData。 JSON序列化方法需要一個NSData對象,但獲得nil,因此它會拋出NSInvalidArgumentException

你的方法沒有看起來不正確,你只需要檢查你的URL是否有效。在嘗試執行JSON序列化之前,檢查data是否爲非nil是一個好主意。

如何檢查數據是否爲零

if (data == nil) 
{ 
    //handle the problem 
} 
else 
{ 
    //You have valid content, do something with it 
} 
+0

如何檢查數據是否爲零?有沒有比在NSLog中調用描述更好的方法?當我這樣做時,它滯後於我的機器很糟糕。另外,我編輯了我的問題,你可以看一看,看看你認爲可能是錯的嗎? – Chance 2012-07-31 16:09:23

+0

'NSLog'只能在調試過程中使用;當你發佈你的應用程序時,它不包括在內,所以滯後不是問題(雖然你因爲NSLog而滯後很奇怪)。更新答案。 – Dustin 2012-07-31 16:18:01

+0

感謝您的回覆。我無法相信我沒有想到明顯的事情!但是當我添加一個if循環發送一個NSLog數據== nil時,它不會觸發NSLog。所以我猜這個錯誤發生在創建NSDictionary json時?我會用if語句測試更新我的問題。 – Chance 2012-07-31 16:25:27

1

的Flickr確實與他們的JSON一些不好的事情分析器無法應付:

  • 他們開始與「jsonFlickrFeed(」和結束「)」
    • 這意味着根對象無效
  • 他們不正確地轉義單引號..例如。 \'
    • 這是無效的JSON,並會使解析器傷心!

對於那些希望處理弗裏克JSON提要

//get the feed 
NSURL *flickrFeedURL = [NSURL URLWithString:@"http://api.flickr.com/services/feeds/photos_public.gne?format=json&tags=data"]; 
NSData *badJSON = [NSData dataWithContentsOfURL:flickrFeedURL]; 
//convert to UTF8 encoded string so that we can manipulate the 'badness' out of Flickr's feed 
NSString *dataAsString = [NSString stringWithUTF8String:[badJSON bytes]]; 
//remove the leading 'jsonFlickrFeed(' and trailing ')' from the response data so we are left with a dictionary root object 
NSString *correctedJSONString = [NSString stringWithString:[dataAsString substringWithRange:NSMakeRange (15, dataAsString.length-15-1)]]; 
//Flickr incorrectly tries to escape single quotes - this is invalid JSON (see http://stackoverflow.com/a/2275428/423565) 
//correct by removing escape slash (note NSString also uses \ as escape character - thus we need to use \\) 
correctedJSONString = [correctedJSONString stringByReplacingOccurrencesOfString:@"\\'" withString:@"'"]; 
//re-encode the now correct string representation of JSON back to a NSData object which can be parsed by NSJSONSerialization 
NSData *correctedData = [correctedJSONString dataUsingEncoding:NSUTF8StringEncoding]; 
NSError *error = nil; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:correctedData options:NSJSONReadingAllowFragments error:&error]; 
if (error) { 
    NSLog(@"this still sucks - and we failed"); 
} else { 
    NSLog(@"we successfully parsed the flickr 'JSON' feed: %@", json); 
}