如何将 NSArray 和 NSDictionary 用于此 SQL 数据?

How can I use NSArray and NSDictionary with this SQL data?

无法解析 JSON 数据。

无法将“__NSArrayI”类型的值 (0x10f02fc08) 转换为 'NSMutableArray' (0x10f02fcd0)。

JSON 数据 here 和代码在这里;

echo json_encode($resultArray);

这是我的试用代码;

func parseJSON() {
    var jsonResult: NSMutableArray = NSMutableArray()

    do{
        jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSMutableArray
    } catch let error as NSError {
        print(error)
    }

    var jsonElement: NSDictionary = NSDictionary()
    let locations: NSMutableArray = NSMutableArray()

    for i in 1...jsonResult.count
    {
        jsonElement = jsonResult[i-1] as! NSDictionary

        let location = LocationModel()

        if let name = jsonElement["Name"] as? String,
            let address = jsonElement["Address"] as? String,
            let latitude = jsonElement["Latitude"] as? String,
            let longitude = jsonElement["Longitude"] as? String
        {
            location.name = name
            location.address = address
            location.latitude = latitude
            location.longitude = longitude

        }
        locations.add(location)
    }
    DispatchQueue.main.async(execute: { () -> Void in

        self.delegate.itemsDownloaded(items: locations)

    })
}

注意:它将修复 THIS

而不是:

var jsonResult: NSMutableArray = NSMutableArray()

这样做:

var jsonResult: NSArray = NSArray()

而不是:

jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSMutableArray

这样做:

jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray

完整代码:

func parseJSON() {
    var jsonResult: NSArray = NSArray()
    do{
        jsonResult = try JSONSerialization.jsonObject(with: self.data as Data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
    } catch let error as NSError {
        print(error)
    }

    var jsonElement: NSDictionary = NSDictionary()
    let locations: NSMutableArray = NSMutableArray()

    for i in 1...jsonResult.count
    {
        jsonElement = jsonResult[i-1] as! NSDictionary

        let location = LocationModel()

        if let name = jsonElement["Name"] as? String,
            let address = jsonElement["Address"] as? String,
            let latitude = jsonElement["Latitude"] as? String,
            let longitude = jsonElement["Longitude"] as? String
        {

            location.name = name
            location.address = address
            location.latitude = latitude
            location.longitude = longitude

        }

        locations.add(location)

    }
    DispatchQueue.main.async(execute: { () -> Void in

        self.delegate.itemsDownloaded(items: locations)

    })
}

问题是 JSONSerialization 正在返回一个不可变数组,您不能只将 NSArray 转换为 NSMutableArray。相反,只需将其声明为 NSArray:

func parseJSON() {
    var jsonResult: NSArray

    do {
        jsonResult = try JSONSerialization.jsonObject(with: data as Data) as! NSArray
    } catch let error as NSError {
        print(error)
        return
    }

    ...
}

或者,或者,使用 Swift 的原生集合类型,而不是退回到旧的 NSArrayNSDictionary 类型:

func parseJSON() {
    var jsonResult: [[String: Any]]  // this is an array of dictionaries

    do {
        jsonResult = try JSONSerialization.jsonObject(with: data as Data) as! [[String: Any]]
    } catch let error as NSError {
        print(error)
        return
    }

    for jsonElement in jsonResult {            
        if let name = jsonElement["Name"] as? String,
            let address = jsonElement["Address"] as? String,
            let latitude = jsonElement["Latitude"] as? String,
            let longitude = jsonElement["Longitude"] as? String
        {
            let location = LocationModel()
            location.name = name
            location.address = address
            location.latitude = latitude
            location.longitude = longitude
            locations.add(location) // or, if you defined `locations` to be a Swift array, `locations.append(location)`
        }
    }
    ...
}

(就个人而言,我可能还会将 data 定义为 Data 而不是 NSData 并将 locations 定义为 [LocationModel]而不是 NSMutableArray.)