#json #swift
Вопрос:
У меня есть следующая структура, которая была автоматически создана из файла JSON:
struct EmergencyNumberModel: Codable, Identifiable { let id = UUID() let country: Country let ambulance: Ambulance let fire: Fire let police: Ambulance let dispatch: Dispatch let member112, localOnly: Bool let notes: NotesUnion lt;lt;lt;lt; let noData: Bool? let traffic: Traffic? enum CodingKeys: String, CodingKey { case country = "Country" case ambulance = "Ambulance" case fire = "Fire" case police = "Police" case dispatch = "Dispatch" case member112 = "Member_112" case localOnly = "LocalOnly" case notes = "Notes" case noData = "NoData" case traffic = "Traffic" } }
И чтобы использовать информацию из JSON в представлении, я создал функцию, которая возвращает пример с информацией:
static func example() -gt; EmergencyNumberModel { return EmergencyNumberModel(country: Country(name: "Japan", isoCode: "JP", isoNumeric: "392"), ambulance: Ambulance(all: ["119"], gsm: nil), fire: Fire(all: ["119"]), police: Ambulance(all: ["110"], gsm: nil), dispatch: Dispatch(all: [nil], fixed: nil, gsm: nil), member112: false, localOnly: false, notes: NotesUnion, lt;lt;lt;lt;lt;lt; noData: nil, traffic: Traffic(all: ["122"])) }
Но поле примечания в JSON иногда отсутствует или имеет разные типы, примечания в JSON выглядят следующим образом:
"Notes": ""
или вот так:
"Notes": false
И из-за этого генератор структуры создал это:
enum NotesUnion: Codable { case bool(Bool) case enumeration(NotesEnum) case null init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() if let x = try? container.decode(Bool.self) { self = .bool(x) return } if let x = try? container.decode(NotesEnum.self) { self = .enumeration(x) return } if container.decodeNil() { self = .null return } throw DecodingError.typeMismatch(NotesUnion.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for NotesUnion")) } func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() switch self { case .bool(let x): try container.encode(x) case .enumeration(let x): try container.encode(x) case .null: try container.encodeNil() } } } enum NotesEnum: String, Codable { case empty = "" case uninhabited = "Uninhabited" }
Я немного исследовал и теперь знаю, что код предназначен для преобразования между типами JSON и Swift.
Когда я автоматически заполняю тип объединения заметок, Xcode выдает мне это:
NotesUnion(from: Decoder)
Какой тип декодера мне нужен, чтобы иметь возможность сгенерировать пример, чтобы использовать его в представлении?
Комментарии:
1. Вы сами так не называете, используйте
JSONDecoder().decode(...)