2011-09-15 35 views
0

我還沒有看到關於這個的非常明確的答案。出於某種原因,我不明白,我從中接收數據的服務器在開始時會返回一個帶有很多(可能是數百個)空字節的JSON響應。來自NSData的NSString - 服務器返回帶領先的空值的NSData

當我使用下面的代碼,該字符串顯示爲空值:

NSString* newStr = [[[NSString alloc] initWithData:dataToBeLoaded encoding:NSUTF8StringEncoding] autorelease]; 

顯然這是一個常見的問題,但我還沒有看到關於如何NSData的轉換爲一個NSString一個明確的答案。

直到最近,我看到這個問題帶有一箇中間的NSString值,但是當我從開始和結束剝離少量(但不是數百個)字符後,它就消失了。剝離後的NSString非常好,所以我認爲編碼方法不是問題。

是否有內置方法可以正確執行此操作?我必須要想象一下,我會寫入的代碼會逐字節地傳輸,效率會更高。

順便說一下,當我在瀏覽器中手動發送JSON請求到服務器時,響應返回爲完全有效的JSON,在瀏覽器屏幕中沒有明顯的問題。

任何想法我應該做什麼?謝謝。

+0

爲什麼這應該是一個常見問題?你還在哪裏看過它?你有沒有使用fiddler(或類似的工具)檢查服務器的JSON響應是否正常? _dataToBeLoaded_的內容是什麼?完整的JSON響應或僅僅是JSON響應的一部分?請提供更多信息。 – Codo

+0

再次閱讀此問題後,我很清楚服務器部分需要修復,而不是iOS或Mac OS客戶端?你能修復服務器還是其他人的責任?無論如何使用哪種服務器技術? – Codo

+0

好的,我不知道它在數百萬程序員的世界中是否常見,但我已經看到了幾次,沒有真正的答案。服務器不在我的控制之下,我從兩臺服務器上看到了這一點。我將在下面用我發現對我的應用程序有用的解決方案回答我的問題。 – Jim

回答

0

從每個服務器返回的數據包含有效的JSON(在許多情況下用JSON Lint驗證)。在一種情況下,返回數據是一個包含JSON對象的JavaScript分配語句。在另一種情況下,它只是一個JSON對象。在這兩種情況下,我知道JSON對象以一個大括號開頭。

因此,爲了去掉所有主要的空值,我使用下面的代碼。似乎有些方法將字符串數據視爲N字符串,就像C字符串一樣,但其他方法知道還有更多,包括對長度的瞭解。幸運的是,rangeOfStringsubstringFromIndex超越領先的空值。

NSString* newStr = [[[NSString alloc] initWithData:dataToBeLoaded encoding:NSUTF8StringEncoding] autorelease]; 

if (newStr == nil) return; 

NSRange headRange = [newStr rangeOfString:@"{"]; 
NSString *stripped = [newStr substringFromIndex:headRange.location];