【发布时间】:2014-07-18 22:01:34
【问题描述】:
我正在使用 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 开发者论坛上发布了同样的问题,当数据中有表情符号字符时,NSJSONSerialization.JSONObjectWithData() 的 Swift 版本中确实存在错误。我希望这在最终版本中得到解决。
此外,将我的变量从 [AnyObject] 更改为 as? Dictionary,如下面的一些建议,我的应用程序不再崩溃。
【问题讨论】:
-
有没有人意识到超过一半的快速问题是关于解析 JSON 或 XML 的?
-
在这种情况下,看起来您的 JSON 将返回字典而不是数组。
-
@JackWu 这是 [AnyObject] 的数组,所以没关系。我之前用 [AnyObject] 解析了类似的复杂 JSON,它运行良好,我认为这不是问题。此外,我上面代码的 Objective-C 版本正在将结果发送到 NSArray 并且它也能正常工作。不过,感谢您的快速回复。
-
尝试在上面调用
NSJSONSerialization.isValidJSONObject,它返回true吗? -
另外,它在 Swift 中也很重要,它是强类型的。您的 JSON 的顶级对象不是数组。
JSONObjectWithData:options:error:返回一个 Foundation Object,在这种情况下它看起来像一个字典。尝试将其转换为字典,看看它是否仍然崩溃