2014-07-18 66 views
-1

我正在使用Swift解析JSON字符串。這是代碼:使用Swift解析JSON字符串時出錯

var jsonStr = "..." // JSON string 
var data = jsonStr.dataUsingEncoding(NSUTF8StringEncoding) 
var error: NSError? 
var array = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as [AnyObject] 

而且這段代碼幾乎可以一直工作。但今天我試圖解析一個新的字符串輸入,但它在最後一行中崩潰了我的應用程序。我甚至無法看到「錯誤」變量中的錯誤消息......它在更新錯誤信息之前崩潰了。

,我試圖解析JSON字符串是在這裏:http://pastebin.com/wf6jtNhf

我相信,我的JSON字符串是有效的,原因有二:

  • 我驗證使用輸入jsonlint.com
  • 我創建的代碼的Objective-C的版本上面,它成功地解析相同的輸入

任何人都可以明白了一個道理,爲什麼我不能相提並論選擇這個字符串還是應該假設NSJSONSerialization類在Swift中被竊聽?我使用Xcode的測試版3

編輯1:

顯然有在我的字符串(表情符)很多UTF-16字符。有沒有一個關鍵字來解析保存這些字符的字符串?我試圖NSUTF16StringEncoding下面的代碼,但沒有奏效:

var data = jsonStr.dataUsingEncoding(NSUTF16StringEncoding) 

編輯2:

我在蘋果開發者論壇上張貼了這個同樣的問題,顯然也的確是在斯威夫特的錯誤當數據中有表情符號時,NSJSONSerialization.JSONObjectWithData()的版本。我希望這在最終版本中得到解決。

此外,將我的變量從[AnyObject]更改爲as? Dictionary,如下面的一些建議,並沒有讓我的應用程序崩潰。

+2

有沒有人意識到,超過一半的問題是關於解析JSON或XML? – Jack

+0

在這種情況下,它看起來像你的JSON將返回一個字典,而不是一個數組。 – Jack

+0

@JackWu它是一個[AnyObject]的數組,所以它沒關係。我之前用[AnyObject]解析了類似複雜的JSON,它工作正常,我不認爲這是問題。另外,我上面的代碼的Objective-C版本將結果發送給一個NSArray,它也起作用。儘管如此,感謝您的快速響應。 – vegidio

回答

1

在我的電腦上測試這個,你正在崩潰,因爲你正在鑄造as [AnyObject],並且你沒有得到結果。如果您將其更改爲as? [AnyObject],那麼它將允許返回值爲空,然後您將能夠打印該錯誤。

至於它沒有解析的原因,我還不太確定。罪魁禍首似乎是下面的塊,不知道爲什麼它是無效的,也許一些UTF給解析代碼的問題。

"id": "@babiminkah", 
       "nome": "B\u00E1rbara Santos", 
       "imagem": "http://pbs.twimg.com/profile_images/490247572175327233/w4dXqfPm_bigger.jpeg", 
       "texto": "amanh\u00E3 tem b\u00F3 do catarina..... na friends \uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02\uD83D\uDE02\uDE02", 
       "horario": "2014-07-18 17:43:04" 
       } 

EDIT1:挖出多件該塊的,這是造成問題的texto字段的值。如果你刪除所有的值,包括\uD83D它將會起作用。這些unicode值似乎是問題。

Edit2:據此,http://www.fileformat.info/info/unicode/char/d83d/index.htm, D83D不是有效的Unicode字符。看來有些後來的人可能不是。

+0

謝謝,天空!我用'as? [AnyObject]'現在按照你的建議,它不會崩潰我的應用程序了,但'錯誤'仍然是零。無論如何,你似乎是對的Unicode字符,但我想知道爲什麼Objective-C版本的代碼解析JSON沒有一個單一的問題... – vegidio

+0

你是最好的。我剛剛發現D83D是一個愚蠢的表情符號......我會在解析JSON之前嘗試從字符串中刪除它。正如我之前所說的,有趣的部分是,NSJSONSerialization的Objective-C版本可以解析該字符串...顯然Swift版本還不能這樣做。再次感謝! – vegidio

+0

\ uD83D是編碼一個平面1個字符的代理對的第一個大廳,這對是編碼的:\ uD83D \ uDE02。但是在每對之後還有一個額外的\ uDE02,所以編碼是不正確的。請參閱[UTF-16](http://en.wikipedia.org/wiki/UTF-16)代碼點U + 010000至U + 10FFFF。 Unicode是21位編碼,但直到最近,隨着表情符號的增加,所有字符都可以用16位編碼。 – zaph