【问题标题】:Swift JSONSerialization.jsonObject ErrorSwift JSONSerialization.jsonObject 错误
【发布时间】:2017-03-20 06:46:45
【问题描述】:

我环顾四周,但找不到解决这个困扰我的错误的答案。我尝试添加一个“as!NSMutableArray”,但这给了我另一个错误。关于如何解决它的任何想法?我将我的项目从 Objective-C 转换为 Swift,所以希望代码一切正常,我有 20 多个错误,现在我减少到 3 个错误。谢谢。

错误信息:

'jsonObject' produces 'Any', not the expected contextual result type 'NSMutableArray'

从服务器检索数据的代码

// Retrieving Data from Server
func retrieveData() {

    let getDataURL = "http://ip/example.org/json.php"
    let url: NSURL = NSURL(string: getDataURL)!

    do {

        let data: NSData = try NSData(contentsOf: url as URL)
        jsonArray = JSONSerialization.jsonObject(with: data, options: nil)
    }
    catch {
        print("Error: (data: contentsOf: url)")
    }

    // Setting up dataArray
    var dataArray: NSMutableArray = []

    // Looping through jsonArray
    for i in 0..<jsonArray.count {

        // Create Data Object

        let dID: String = (jsonArray[i] as AnyObject).object(forKey: "id") as! String
        let dName: String = (jsonArray[i] as AnyObject).object(forKey: "dataName") as! String
        let dStatus1: String = (jsonArray[i] as AnyObject).object(forKey: "dataStatus1") as! String
        let dStatus2: String = (jsonArray[i] as AnyObject).object(forKey: "dataStatus2") as! String
        let dURL: String = (jsonArray[i] as AnyObject).object(forKey: "dataURL") as! String

        // Add Data Objects to Data Array
        dataArray.add(Data(dataName: dName, andDataStatus1: dStatus1, andDataStatus2: dStatus2, andDataURL: dURL, andDataID: dID))
    }

    self.myTableView.reloadData()
}

【问题讨论】:

    标签: json swift error-handling nsmutablearray jsonserializer


    【解决方案1】:

    jsonObject 函数将返回 Any 类型的值,但 jsonArray 的类型为 NSMutableArray。如果出现问题,这个函数会抛出错误,在它前面加上一个try 关键字。根据我的经验,让jsonArray 的类型更改为字典数组,这样您就可以轻松提取数据。

        do {
            let data: Data = try Data(contentsOf: url as URL)
            let jsonArray: [[String: AnyObject]] = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [[String: AnyObject]]
            print("json: \(jsonArray)")
    
            for dict in jsonArray {
                let dataName = dict["dataName"] as! String
                print("dataName: \(dataName)")
            }
        }
        catch {
            print("Error: (data: contentsOf: url)")
        }
    

    【讨论】:

    • 好的,所以我尝试了代码,我得到了 2 个错误,一个说“无法使用类型为 '(contentsOf: URL)' 的参数列表调用类型 'Data' 的初始化程序”,第二个错误说“对成员 'jsonObject(with:options:)' 的模糊引用” - 不知道它们是什么意思
    • 你用的是 Swift 2 还是 3?
    • 我用的是 Swift 3。
    • 我看到你有自己的类型名为Data,让我们使用其他名称。在 Swift 3 中,Apple 删除了前缀 NS,所以 NSData 变成了 Data
    • 让这个类型重命名Data(dataName: dName, andDataStatus1: dStatus1, andDataStatus2: dStatus2, andDataURL: dURL, andDataID: dID)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2019-03-14
    • 2021-06-26
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多