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!
}
Другие вопросы по тегам