SwiftyJSON - 表达式含糊不清

时间:2015-10-13 19:44:58

标签: ios swift swifty-json

我尝试使用SwiftyJSON解析JSON但我遇到了问题。

我使用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 个答案:

答案 0 :(得分:2)

您的objects类型为[[String:String]],是一组字典。这些词典的键入为String,值为String

但是你向这个数组中添加了一个包含不同类型值的字典:String s和.stringValue个对象,以及.rawValue一个必须是我认为的NSData类型。< / p>

解决方案可能是键入您的词典[String:AnyObject](以及您的数组[[String:AnyObject]])并在检索值时在另一侧进行类型转换。

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

请注意,解析JSON时效率不高。更好的方法是从数据中创建对象:类或结构。例如,您可以使用结构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)

        }