【发布时间】:2018-10-19 08:14:05
【问题描述】:
我正在编写一个应用程序,我想用汽车品牌和汽车型号填充 2 个相关的 UIPickerViews。
我正在解析输入中的以下 json 文件,其中包含 汽车模型的输入:
[{
"brand": "ALFA ROMEO",
"models": [
"Mito (145)",
"145/146 (930)",
"147 (937)",
"Giulietta (940)",
"155 (167)",
"156 (932)",
"159 (939)",
"Giulia (620)",
"164 (164)",
"166 (136)",
"GTV / Spider (916)",
"Brera",
"Spider (939)",
"GT Coupé (937)",
"4C (643)",
"Stelvio (630)"
]},
{
"brand": "AMC",
"models": [
"Alliance",
"Concord",
"Eagle",
"Encore",
"Spirit"
]
},
...
]
我想获取前 UIPickerView 上的汽车品牌列表 并根据用户对前者的选择来喂养后者......
我使用下面的结构来解析和获取jsondata
struct carBrands : Codable {
let brand : String
let models : [String]
}
这个函数可以让我解析 json 并在 依赖于结构体的汽车对象
var cars:carBrands?
这里是 json 解码器
let url = Bundle.main.url(forResource: "carModels", withExtension: "json")
/*let jsonData = try? Data(contentsOf: url!)
let jsonResponse = try? JSONSerialization.jsonObject(with: jsonData!)*/
URLSession.shared.dataTask(with: url!) { (data, response
, error) in
guard let data = data else { return }
do {
let decoder = JSONDecoder()
let carData = try decoder.decode(carBrands.self, from: data)
print(carData)
self.cars = carData
return
}catch let err {
print("Err", err)
}
}.resume()
我在 xcode 上收到此错误
Err typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))
能否请您展示正确填充我的 uipickerviews 的技巧?
谢谢。
【问题讨论】:
-
你的 JSON 是一个顶级的 NSArray。所以
try decoder.decode(carBrands.self, from: data)应该是try decoder.decode([carBrands].self, from: data) -
谢谢,我已经试过了,但是 swift 说:[无法将类型“[carBrands]”的值分配给类型“carBrands?”]。我应该进行哪些修改以使结构适合数据?
-
将
var cars:carBrands?更改为var cars: [carBrands]?。您的struct carBrands代表一个品牌和该品牌的多个型号。您想要使用(并且您的 JSON 将包含)汽车品牌列表。所以[carBrands]表示该类型的数组 -
效果很好,谢谢 :) 但现在我想获取数组并填充我的选择器视图。关于获取信息并填充信息的任何想法?
-
请根据 Swift 命名约定以大写字母开头的结构命名。并以单数形式命名结构。从语义上讲,
cars中的每个项目都代表一个CarBrand,而不是一个CarBrands。
标签: json swift uipickerview decode