2015-11-05 65 views
-1

我google了很多,几乎复制的代码,我从教程在线找到简单地解析一个在Swift中的json字符串为可用对象。解析json字符串到Swift对象的问题

代码:

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字符串我尝试解析:

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

会发生什么: 程序不会跳进如果让阵列= ...它停在那里,因为它不能将字符串解析为json(或AnyObject),并且将简单地返回AnyObject。

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

+1

你的JSON是一个字典,而不是一个数组。 – Moritz

回答

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?转换。

在操场上快速粘贴它会发现错误被捕获:“JSON文本不是以数组或对象开始,而是选项允许片段未设置。您的JSON片段缺少开头{

一旦这个问题得到解决,你会看到parsed被设置,但随后的if let array = parsed as? [AnyObject]落空。这是因为你的顶级元素是一个字典,而不是一个数组,所以铸造到[AnyObject]失败。

+0

非常感谢:) Im完全新到Swift – BoA456

+0

欢迎来到Swift!你会发现Swift的类型严格性与JSON的开放结构严重地相互作用。我不推荐在你的代码中使用大量的“as”类型转换,我建议研究一下SwiftyJSON和一些其他库,以便在Swift中使用JSON。 –