【问题标题】:Swift get json data into struct and populate pickerViewsSwift 将 json 数据放入 struct 并填充 pickerViews
【发布时间】: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


【解决方案1】:

现在,我的 self.cars 上有这个数组

▿ Optional<Array<carBrands>>
  ▿ some : 70 elements
    ▿ 0 : carBrands
      - brand : "ALFA ROMEO"
      ▿ models : 16 elements
    - 0 : "Mito (145)"
    - 1 : "145/146 (930)"
    - 2 : "147 (937)"
    - 3 : "Giulietta (940)"
    - 4 : "155 (167)"
    - 5 : "156 (932)"
    - 6 : "159 (939)"
    - 7 : "Giulia (620)"
    - 8 : "164 (164)"
    - 9 : "166 (136)"
    - 10 : "GTV / Spider (916)"
    - 11 : "Brera"
    - 12 : "Spider (939)"
    - 13 : "GT Coupé (937)"
    - 14 : "4C (643)"
    - 15 : "Stelvio (630)"
▿ 1 : carBrands
  - brand : "AMC"
  ▿ models : 5 elements
    - 0 : "Alliance"
    - 1 : "Concord"
    - 2 : "Eagle"
    - 3 : "Encore"
    - 4 : "Spirit"
▿ 2 : carBrands
  - brand : "Aston Martin"
  ▿ models : 9 elements
    - 0 : "DB7"
    - 1 : "DB9"
    - 2 : "DBS"
    - 3 : "Lagonda"
    - 4 : "Rapide"
    - 5 : "V12 Vantage"
    - 6 : "V8 Vantage"
    - 7 : "Vanquish"
    - 8 : "Virage"

我必须在列表中列出所有汽车品牌,然后按照用户的选择在另一个选择器中填充汽车型号。你能告诉我该怎么做吗?

对不起,我是初学者。感谢您花时间回答。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多