ios - 无法快速访问 JSON 数组
问题描述
我有一个 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
持有的元素类型。没有Array
不指定其类型的Element
类型。
此外,在 Swift 中不需要类型注释,编译器可以为您推断类型,并且您通过强制转换显式地告诉编译器类型。
carIcons
应该是类型Array<Array<String>>
或简写[[String]]
let carIcons = carData["icons"] as! [[String]]
关于您的代码的一些一般性评论:不要使用旧的 Foundation 类型,例如NSData
在 Swift 中,当它们具有本机 Swift 等效项时。也不要强制解包安全的强制类型,这是没有意义的。要么安全地处理铸造和展开,要么如果你知道铸造肯定会成功,就简单地强制铸造。.mutableContainers
在 Swift 中没有效果,所以不要使用它。不需要在 catch 块中强制error
转换NSError
,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
.
推荐阅读
- jestjs - 为每个执行的测试用例获取独立代码覆盖率文件的选项
- excel - Excel 宏应用条件格式
- teamcity - TeamCity BranchFilter 导致有关默认分支已禁用的错误
- javascript - CastError:模型“User”的路径“_id”处的值“login”转换为 ObjectId 失败
- json - 生成的 swagger json 中的 fastify openapi3 中没有引用 $id
- javascript - 在异步函数内部反应 useSelector 值未更改
- python - 如何在镶木地板目录中查找某些列名
- node.js - 如何在 node.js 上制作登录面板?
- airflow - Apache Airflow:触发前运行的条件
- php - 如何在带有数组的表中创建一个colspan?