无法在swift中访问JSON数组

时间:2018-05-07 14:37:26

标签: ios arrays swift dictionary

我有一个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&lt; _&gt;'类型的值指定类型'Array'

有人可以告诉我我在哪里做错了吗?谢谢!

1 个答案:

答案 0 :(得分:2)

javac first.class是Swift中的泛型类型,因此当您想要声明一个数组变量时,您总是需要具体说明Array所持有的元素类型。如果没有指定Array类型,则没有Array这样的类型。

此外,Swift中不需要类型注释,编译器可以为您推断出类型,并且您通过强制转换明确地告诉编译器类型。

Element应为carIcons类型或速记Array<Array<String>>

[[String]]

关于您的代码的一些一般性评论:当Swift具有原生的Swift等价物时,不要在Swift中使用旧的Foundation类型,例如let carIcons = carData["icons"] as! [[String]] 。也不要强制展开安全铸造类型,这没有任何意义。如果您知道演员表肯定会成功,可以安全地处理演员展开,或者只是强制演员。 NSData对Swift没有影响,所以不要使用它。没有必要在catch块中强制.mutableContainerserror,Swift有自己的NSError类型。

Error

但是,如果您使用的是Swift 4,最好的解决方案是使用类型安全的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) } } } 协议和Codable而不是JSONDecoder