【问题标题】:typeMismatch(Swift.Dictionary<Swift.String, Any> debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead."typeMismatch(Swift.Dictionary<Swift.String, Any> debugDescription: "预期解码 Dictionary<String, Any> 但找到了一个数组。"
【发布时间】:2018-12-14 10:05:20
【问题描述】:

现在我正面临这个错误

“[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)
}
  }

将服务器端数据解码为 Realm Compatible:

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 以使用可解码的。

在顶部提到错误。

【问题讨论】:

  • 我的问题改了,请看一下
  • @Balijinder 你找到解决方案了吗?

标签: ios swift dictionary realm decodable


【解决方案1】:

OrderList 是一个array。您需要在UserOrderHistory 类中更改变量orderList

var orderlist: [OrderList]?

仅保留此行,删除Array

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

到:

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

【讨论】:

  • 我已经从领域中删除了订单列表?.add(orders)。但面临这个运行时错误 typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyError: nil))
【解决方案2】:

下面的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)

您正试图以我看到的方式从对象中解码数组,但这会失败。

【讨论】:

    【解决方案3】:

    请您尝试使用Array&lt;UserOrderHistory&gt;.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)
            }
    

    【讨论】:

    • “[UserOrderHistory]”类型的值没有成员“orderlist”
    • ....这是错误....我已从领域删除订单列表?.add(orders)。但面临这个运行时错误 typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary instead.", underlyError: nil))
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多