2013-01-24 51 views
2

我一直在開發應用程序,它使JSON類型的數據的異步請求。最近,我在代碼中發現了一個奇怪的錯誤,我不知道它爲什麼會發生。NSJSONSerialization有時在異步請求中返回空值

好的代碼!

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

NSError *error=nil; 

    result = [NSJSONSerialization JSONObjectWithData:retrievedData options:kNilOptions error:&error]; 
     NSLog(@"Result %@",result); 
     NSLog(@"Retrieved data %@",retrievedData); 
} 

結果是NSDictionary,retrieveData是NSMutableData。 99%的時間,它工作正常,connectionDidFinishLoading被調用,並且我的結果被填充。然而,在時間的1%提取的數據填充數據,但我的結果是空(你可以在圖片中看到的任何人都可以幫我請

Log

編輯:。?我得到以下錯誤

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.) UserInfo=0x753e5c0 {NSDebugDescription=Garbage at end.} 

回答

3

,如果你看看錯誤首先,看看是否能給出什麼是錯的任何跡象顯示這將有助於。

[編輯]
您的錯誤提到了原因:Garbage at end.

來自網絡服務器的響應無效JSON,它在輸出結尾處包含無效字符。

+0

你是對的,我忘了檢查錯誤...謝謝,更新我的問題:) – Yanchi

+0

所以問題不在我的代碼中,但實際上在服務器端?我問這個,因爲大多數時候它工作正常,我們有Android應用程序,這從來沒有發生:( – Yanchi

+0

判斷的錯誤,是的。你可以通過將'retrieveData'轉換爲字符串來確認這一點,看看實際內容你是否收到,並有選擇地把它扔到一個JSON驗證器中 –

2

我有同樣的問題。首先,看看什麼是不正確地分析數據 - 在我的情況下,我做了

NSString *str = [[NSString alloc] initWithData:retrievedData encoding:NSUTF8StringEncoding]; 

在我的情況的原因是 - 如果服務器連續發出幾個socket.write()的 - 所有數據在一個單一的塊接收,像

{first:json}{second:json}.. 
當然,這不能被解析爲一個單一的JSON

,所以我要介紹分隔符,並將所接收的緩衝區分成正確塊。

1

這是晚了一點,但沒有在網上爲我工作,直到我這樣做:

NSString * dataInString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 

NSRange range = [dataInString rangeOfString:@"}" options:NSBackwardsSearch]; 

if(range.location != NSNotFound) 
    dataInString = [dataInString substringWithRange:NSMakeRange(0,range.location+1)]; 

從那以後總是工作。

0

我有同樣的錯誤,問題是我的服務器附加了一些額外的行到我的JSON響應,這將不會出現時,我會在我的瀏覽器中得到響應。從終端使用curl可以看到實際輸出。 黑客是截斷額外的字符。與json或者你有一個數組或字典。根據您的JSON結構,你可以使用代碼(如上面的答案),但在第2行

NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 
NSRange range = [str rangeOfString:@"}" options:NSBackwardsSearch]; // } for dictionary, ] for array 

if(range.location != NSNotFound) 
str = [str substringWithRange:NSMakeRange(0,range.location+1)]; 

查找評論,一旦你得到你的字符串從垃圾數據清理,可以再次將其轉換爲數據。

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; 

現在從這些數據中你可以得到你的數組或字典。

id jsonObject = [NSJSONSerialization 
       JSONObjectWithData:data 
       options:kNilOptions error:&error]; // i used id to be general, you can use array or dictionary structure or later cast this object to as per json