typeMismatch (Swift.DictionarydebugDescription: "Ожидается расшифровка словаряно нашел вместо этого массив. " - PullRequest
0 голосов
/ 14 декабря 2018

Теперь я сталкиваюсь с этой ошибкой

У значения типа '[UserOrderHistory]' нет члена 'orderlist'

Мой JSON:

{
"OrderList": [
    {
        "orderId": 16976,
        "userId": 4905,
        "pickupdate": "2018-09-23",
    },
    {
        "orderId": 52,
        "userId": 4905,
        "pickupdate": "2018-08-07",
    },
],
"TotalOrder": 2
}

Мой класс декодируемой модели:

    class UserOrderHistory: Object, Decodable {

      var orderlist: [OrderList]?
      var TotalO = RealmOptional<Int>()

     enum CodingKeys: String, CodingKey {
        case orderlist = "OrderList"
        case TotalO = "TotalOrder"
     }
convenience required init(from decoder: Decoder) throws {
    self.init()
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.orderlist = try container.decodeIfPresent(OrderList.self, forKey: .orderlist)
    self.TotalO.value = try container.decodeIfPresent(Int.self, forKey: .TotalO)
}

required init() {
    super.init()
}

required init(value: Any, schema: RLMSchema) {
    super.init(value: value, schema: schema)
}

required init(realm: RLMRealm, schema: RLMObjectSchema) {
    super.init(realm: realm, schema: schema)
}
}


class OrderList: Object, Decodable{
var orderId = RealmOptional<Int>()
var userId = RealmOptional<Int>()
@objc dynamic var pickupdate: String? = nil

enum CatCodingKeys: String, CodingKey {
    case orderId
    case userId
    case pickupdate
}

convenience required init(from decoder: Decoder) throws {
    self.init()
    let container = try decoder.container(keyedBy: CatCodingKeys.self)
    self.orderId.value = try container.decodeIfPresent(Int.self, forKey: .orderId)
    self.userId.value = try container.decodeIfPresent(Int.self, forKey: .userId)

    self.pickupdate = try container.decodeIfPresent(String.self, forKey: .pickupdate)

}

required init() {
    super.init()
}

required init(value: Any, schema: RLMSchema) {
    super.init(value: value, schema: schema)
}

required init(realm: RLMRealm, schema: RLMObjectSchema) {
    super.init(realm: realm, schema: schema)
}
  }

Декодирование данных со стороны сервера в область совместимости:

let decoder = JSONDecoder()
            do {
            let orders = try decoder.decode(Array<UserOrderHistory>.self, from: data)

                try? realm!.write {
                    realm?.add(orders.orderlist!)
                }

            }catch {
                 print(error)
            }

В чем проблема.

  1. Как я могу решить эту проблему.
  2. Есть ли какой-либо другой и простой способ разобрать этот тип json с использованием decodable.

Упомяните об ошибке сверху.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

OrderList - это array.Вам нужно изменить переменную orderList в UserOrderHistory классе:

var orderlist: [OrderList]?

Сохранить эту строку, как и прежде, удалить Array:

let orders = try decoder.decode(Array<UserOrderHistory>.self, from: data)

до:

let orders = try decoder.decode(UserOrderHistory.self, from: data)

0 голосов
/ 14 декабря 2018

Следующий объект json соответствует только одному экземпляру UserOrderHistory:

{
"OrderList": [
    {
        "orderId": 16976,
        "userId": 4905,
        "pickupdate": "2018-09-23",
    },
    {
        "orderId": 52,
        "userId": 4905,
        "pickupdate": "2018-08-07",
    },
],
"TotalOrder": 2
}

Следовательно, будет достаточно использовать следующее для декодирования:

let orders = try decoder.decode(UserOrderHistory.self, from: data)

Вы пытаетесь декодировать массив изобъект, каким я его вижу, и он потерпит неудачу.

0 голосов
/ 14 декабря 2018

Можете ли вы попробовать использовать Array<UserOrderHistory>.self вместо UserOrderHistory.self

В вашем UserOrderHistory классе

var orderlist: [OrderList]?

Таким образом, код должен выглядеть следующим образом:

let decoder = JSONDecoder()
        do {
        let orders = try decoder.decode(Array<UserOrderHistory>.self, from: data)

            try? realm!.write {
                realm?.add(orders.orderlist!)
            }

        }catch {
             print(error)
        }
...