将json String解析为Swift中的对象时出现问题

时间:2015-11-05 18:43:52

标签: json swift

我google了很多,几乎复制了我从教程在线找到的代码,只是简单地将Swift中的json String解析为可用的对象。

代码:

func parseJson(json: String) -> [AnyObject] {
    let data = json.dataUsingEncoding(NSUTF8StringEncoding)
    do {
        if let array = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? [AnyObject] {
                return array
            }
    }
    catch {
        // Error hanndling here
    }

    return [AnyObject]()
}

Json String我试图解析:

"response":{"loggedIn":false,"message":"Some errormessage here"}}

会发生什么: 该程序不会跳转到if let array = ...它会停在那里,因为它无法将字符串解析为json(或AnyObject),只会返回AnyObject。

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:1)

稍微调整一下代码以便进行更好的调试:

func parseJson(json: String) -> [AnyObject] {
    let data = json.dataUsingEncoding(NSUTF8StringEncoding)
    do {
        let parsed = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)
        if let array = parsed as? [AnyObject] {
                return array
            }
    }
    catch {
        print(error)
    }

    return [AnyObject]()
}

那里有两处变化:

  1. 打印任何错误。
  2. 分两步执行JSONObjectWithDataas?转换。
  3. 在操场上快速粘贴会发现错误被捕获:“JSON文本不是以数组或对象开头,而是选项允许未设置碎片。”您的JSON片段缺少开头{

    修复问题后,您会看到parsed已设置,但随后的if let array = parsed as? [AnyObject]会失效。那是因为您的顶级元素是字典而不是数组,因此转换为[AnyObject]失败。