使用Swift解析JSON字符串时出错

时间:2014-07-18 22:01:35

标签: json swift

我正在使用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 Beta 3。

修改1:

显然我的字符串中有很多UTF-16字符(表情符号字符)。是否有一个键来解析保留这些字符的字符串?我尝试了NSUTF16StringEncoding下面的代码,但它不起作用:

var data = jsonStr.dataUsingEncoding(NSUTF16StringEncoding)

编辑2:

我在Apple Developer论坛上发布了同样的问题,显然当数据中有表情符号字符时,Swift版NSJSONSerialization.JSONObjectWithData()确实存在错误。我希望这在最终版本中得到修复。

另外,如下所示,将我的变量从[AnyObject]更改为as? Dictionary不会导致我的应用程序崩溃。

1 个答案:

答案 0 :(得分: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.htmD83D不是有效的unicode字符。似乎有些后续的也不是。