【发布时间】:2021-11-18 04:20:27
【问题描述】:
这是我第一次在 Swift 中使用 JSON,当我尝试使用我的模型解析文件时,出现以下错误:
给定的数据不是有效的 JSON。
我认为问题在于我如何制作模型。
我解析 JSON 的方式:
import SwiftUI
struct EmergencyView: View {
let emergency: [EmergencyNumberModel]
init() {
let url = Bundle.main.url(forResource: "emergency",
withExtension: "json")!
let data = try! Data(contentsOf: url)
emergency = try! JSONDecoder().decode([EmergencyNumberModel].self, from: data) //Error
}
var body: some View {
List(emergency, id: \.id) { emer in
if emer.Country != nil {
Label(emer.Country, systemImage: "quote.bubble")
.font(.headline)
} else{
Text(emer.Country)
}
}
navigationTitle("Emergency")
}
}
这是我使用的 JSON 的一部分,“emergency.json”:
[
{
"Country": {
"Name": "Afghanistan",
"ISOCode": "AF",
"ISONumeric": "4"
},
"Ambulance": {
"All": [
"112"
]
},
"Fire": {
"All": [
"119"
]
},
"Police": {
"All": [
"119"
]
},
"Dispatch": {
"All": [
null
]
},
"Member_112": false,
"LocalOnly": true,
"Notes": false
},
.
.
.
]
这是我的模型,“EmergencyNumberModel.swift”:
struct EmergencyNumberModel: Codable, Identifiable {
var id = UUID()
let Country: String
let Ambulance: String
let Fire: String
let Police: String
let Dispatch: String
}
我的模型中是否需要其他变量才能访问内部键或变量的数据类型错误?
【问题讨论】:
-
“构建”你的模型,将你的 json 复制并粘贴到quicktype.io 它会为你生成你的 swift 模型。请注意,在 View 的
init()中进行解码不是一个好主意。为此建立一个专门的模型/经理。也不要使用“!”在您的代码中。 -
关于的好建议。现在,您的
EmergencyNumberModel与 JSON 不匹配——它需要进行重大更改才能正确解码(您可能应该使用do/try/catch来做——而不是try!)。 app.quicktype.io 将是解决此问题的最快方式。 -
如果您收到的错误是“给定的数据不是有效的 JSON”。那么问题不在于您的模型(至少,不是直接的问题),而在于您的 JSON。我建议使用像 JSONlint.com 这样的验证器来确保你的 JSON 是好的。