繁体   English   中英

无法快速访问JSON数组

[英]unable to access JSON array in swift

我有一个JSON文件,正在尝试访问其中的数组。

JSON文件如下所示:

{
 "cars": [{
                    "name": "BMW",
                    "icons": [["front.png", "back.png", "B3"],
                              ["front_red", "back_red", "C4"]
                             ]
           }]
}

// cars是一个字典数组,我刚刚在代码段中提到了一个。

我得到的JSON数据为:

func loadJSONData(){

        if let path = Bundle.main.path(forResource: "testJSON", ofType: "json")
        {
            if let jsonData = NSData(contentsOfFile : path)
            {
                do {
                    if let jsonResult = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String:Any]
                    {
                        self.testJSONData = (jsonResult["cars"] as? Array)! 
                        //self.testJSONData = (jsonResult["cars"] as? Array<Dictionary<String, Any>>)!    //also tried this
                    }

                }
                catch let error as NSError {
                    print(error.localizedDescription)
                }
            }
        }
    }

将testJSONData声明为数组:

var testJSONData = [] as [Dictionary<String, Any>]

并且尝试从JSON获取“ icons”数组时发生错误。

let namePredicate = NSPredicate(format: "name like BMW")
let filteredArray :Array = testJSONData.filter() { namePredicate.evaluate(with: $0) }
let carData: Dictionary = filteredArray[0] as Dictionary<String, Any>
let carIcons: Array = carData["icons"] as! Array //error at this line

无法将'Array <_>'类型的值转换为指定的'Array'类型

有人可以告诉我我做错了什么吗? 谢谢!

Array是Swift中的通用类型,因此,当您要声明数组变量时,始终需要特定于Array所持有的元素类型。 如果不指定其Element类型,则没有Array这样的类型。

另外,在Swift中不需要类型注释,编译器可以为您推断类型,并且您无论如何都要显式地告诉编译器类型。

carIcons的类型应为Array<Array<String>>或作为简写[[String]]

let carIcons = carData["icons"] as! [[String]]

关于您的代码的一些一般性注释:不要使用旧的Foundation类型,例如当它们具有本机Swift等效项时,不要在Swift中使用NSData 也不要强制解开安全类型转换,这没有任何意义。 无论是处理铸造安全地展开或干脆强迫投,如果你知道剧组将肯定成功。 .mutableContainers在Swift中无效,因此请不要使用它。 无需在catch块中将error NSErrorNSError ,Swift具有自己的Error类型。

func loadJSONData(){
    if let fileURL = Bundle.main.url(forResource: "testJSON", withExtension: "json") {
        do {
            let jsonData = try Data(contentsOfFile: fileURL)
            if let jsonResult = try JSONSerialization.jsonObject(with: jsonData) as? [String:Any], let cars = jsonResult["cars"] as? [[String:Any]] {
                self.testJSONData = cars
            } else {
                print("Unexpected JSON format")
            }
        }
        catch {
            print(error)
        }
    }
}

但是,如果使用的是Swift 4,最好的解决方案是使用类型安全的Codable协议和JSONDecoder而不是JSONSerialization

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM