Swift 4 декодирует JSON с использованием Codable и Realm
Несколько месяцев назад я начал изучать, как использовать новый кодируемый код, и разместил этот вопрос в Swift 4, декодирующем json с использованием Codable. Прямо сейчас я пытаюсь использовать Realm, и я изменил модель, чтобы следовать документам, но я продолжаю получать ошибку, которая не соответствует декодируемой. Я довольно потерян, как заставить эту работу.
{
"success": true,
"message": "got the locations!",
"data": {
"LocationList": [
{
"LocID": 1,
"LocName": "Downtown"
},
{
"LocID": 2,
"LocName": "Uptown"
},
{
"LocID": 3,
"LocName": "Midtown"
}
]
}
}
class Location: Object, Decodable {
@objc dynamic var success: Bool = true
let data = List<LocationData>()
}
class LocationData: Object, Decodable {
let LocationList = List<LocationItem>()
}
class LocationItem: Object, Decodable {
@objc dynamic var LocID: Int!
@objc dynamic var LocName: String!
}
1 ответ
Вместо того, чтобы объявлять ваши списки так:
let data = List<LocationData>()
let LocationList = List<LocationItem>()
Объявите их так:
var data = LocationData()
var LocationList = [LocationItem]()
Это подтверждает codable/decodable
Обновить:
Я сделал тест, который работал с вашими моделями, попробуйте это:
struct Location: Decodable {
let success: Bool
let message: String
var data = LocationData()
}
struct LocationData: Decodable {
var LocationList = [LocationItem]()
}
struct LocationItem: Decodable {
var LocID: Int
var LocName: String
}
let json = "{ \"success\": true, \"message\": \"got the locations!\", \"data\": { \"LocationList\": [ { \"LocID\": 1, \"LocName\": \"Downtown\" }, { \"LocID\": 2, \"LocName\": \"Uptown\" }, { \"LocID\": 3, \"LocName\": \"Midtown\" } ] } }"
do {
let data = Data(json.utf8)
let decoded = try JSONDecoder().decode(Location.self, from: data)
print(decoded)
} catch let error {
print(error)
}
Это выведет:
Location(success: true, message: "got the locations!", data: CodableDecodable.LocationData(LocationList: [CodableDecodable.LocationItem(LocID: 1, LocName: "Downtown"), CodableDecodable.LocationItem(LocID: 2, LocName: "Uptown"), CodableDecodable.LocationItem(LocID: 3, LocName: "Midtown")]))
В вашем случае ваши модели должны быть:
class Location: Object, Decodable {
@objc dynamic var success: Bool = true
var data = LocationData()
}
class LocationData: Object, Decodable {
var LocationList = [LocationItem]()
}
class LocationItem: Object, Decodable {
@objc dynamic var LocID: Int!
@objc dynamic var LocName: String!
}