gpt4 book ai didi

ios - 无法快速访问 JSON 数组

转载 作者:行者123 更新时间:2023-11-28 12:00:22 27 4
gpt4 key购买 nike

我有一个 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 中获取“图标”数组时发生错误。

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

Cannot convert value of type 'Array<_>' to specified type 'Array'

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

最佳答案

Array Array 是 Swift 中的泛型类型,所以当你要声明一个数组变量时,你总是需要指定元素的类型。持有。没有 Array 这样的类型未指定其 Element类型。

此外,在 Swift 中不需要类型注释,编译器可以为您推断类型,您通过强制转换显式地告诉编译器类型。

carIcons应该是 Array<Array<String>> 类型或简写 [[String]]

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

关于您的代码的一些一般性评论:不要使用旧的 Foundation 类型,例如 NSData在 Swift 中,当他们有原生的 Swift 等价物时。也不要强制展开安全类型转换,那是没有意义的。安全地处理转换 展开,或者如果您知道转换肯定会成功,则只需强制转换。 .mutableContainers在 Swift 中没有效果,所以不要使用它。没有必要投 errorNSError在 catch block 中,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协议(protocol)和 JSONDecoder而不是 JSONSerialization .

关于ios - 无法快速访问 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50216790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com