2015-10-13 37 views
1

我尝试使用SwiftyJSON解析JSON,但是我面临一个问题。SwiftyJSON - 表达不明确

我使用here

这里的教程是我的代码

var JSONStorage : [Article?]? 
var objects = [[String: String]]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let number = arc4random_uniform(1000) 
    let urlString = "http://78.27.190.58:3200/api/get_article/17?\(number)" 

    if let url = NSURL(string: urlString) { 
     if let data = try? NSData(contentsOfURL: url, options: []) { 
      let json = JSON(data: data) 

      for element in json["article"].arrayValue { 

       let id = Int(element["id"].stringValue) 
       let title = element["title"].stringValue 
       let subtitle = element["subtitle"].stringValue 
       let body = element["body"].stringValue 
       let img = element["images"]["main"].rawValue 
       let obj = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img] 


       objects.append(obj) 

      } 

     } 
    } 

} 

这里我得到了

enter image description here

什么我做错了错误?

回答

2

objects[[String:String]]型,词典的数组。这些字典的键值分别为StringString

但你添加到这个阵列包含不同类型的值的字典:String s的你.stringValue对象和.rawValue其中一个类型必须为NSData的我相信。

一个解决方案可能是键入您的字典[String:AnyObject](因此您的数组[[String:AnyObject]]),并在检索值时在另一端进行类型转换。

顺便说一句,编译器说“表达式不明确”,因为它在推断数组类型(现在我们知道为什么)时失败。

请注意,它在解析JSON时不是最有效的。更好的方法是从数据中创建对象:类或结构体。例如,您可以使用struct Article来保存每个element的值,就像您在另一个问题中显示的一样。

+1

埃里克,非常感谢你!你是我的救星:) –

0

swift中的数组或字典不能是异构的。如果你看看你的代码,你想把一个int和四个字符串作为obj的值。

这将工作:

for element in json["article"].arrayValue { 

      let id = element["id"].stringValue // must be string to put it in obj 
      let title = element["title"].stringValue 
      let subtitle = element["subtitle"].stringValue 
      let body = element["body"].stringValue 
      let img = element["images"]["main"].rawValue 
      let obj: [String: String] = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img] 


      objects.append(obj) 

     }