I'm playing around with SwiftUI on a little app I'm building but I'm running into an issue with Codable and I'm getting a few errors.
I have a JSON file which looks like this
[
{
"id": "",
"name": "services",
"items": [
{
"id": 0
"businessName": "Some Name",
"businessTelephone": "01234567890",
"businessEmail": "email@gmail.com",
"businessWebsite": "website.com",
"businessLocation": { "latitude": "54.137256", "longitude": "-1.524727" },
"travelLimit": 50,
"description": "A description about some business",
"categories": ["Category 1"]
}
}
]
I have a struct that looks like this
struct Service: Hashable, Codable, Identifiable {
var id: Int
var businessName: String
var businessTelephone: String
var businessEmail: String
var businessWebsite: String
var businessLocation: Array<Any>
var travelLimit: Int
var description: String
var categories: [Category]
enum Category: String, CaseIterable, Hashable, Codable {
case category1 = "Category 1"
case category2 = "Category 2"
}
}
However, I get the following errors
Type 'Service' does not conform to protocol 'Decodable'
Type 'Service' does not conform to protocol 'Encodable'
Type 'Service' does not conform to protocol 'Equatable'
Type 'Service' does not conform to protocol 'Hashable'
Codable
can't have Any
, plus businessLocation
is a dictionary not an array, so Replace
var businessLocation: Array<Any>
with
var businessLocation:[String:String]
OR
Models
// MARK: - Element
struct Root: Codable {
let id, name: String
let items: [Item]
}
// MARK: - Item
struct Service: Codable {
let id: Int
let businessName, businessTelephone, businessEmail, businessWebsite: String
let businessLocation: BusinessLocation
let travelLimit: Int
let itemDescription: String
let categories: [String]
enum CodingKeys: String, CodingKey {
case id, businessName, businessTelephone, businessEmail, businessWebsite, businessLocation, travelLimit
case itemDescription = "description"
case categories
}
}
// MARK: - BusinessLocation
struct BusinessLocation: Codable {
let latitude, longitude: String
}
Decode
do {
let res = try JSONDecoder().decode([Root].self, from: data)
print(res)
}
catch {
print(error)
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.