为JSON创建模型,其中键是一个值

时间:2019-05-21 06:59:26

标签: ios json swift objectmapper

JSON

{  
    "rows" :
    [
        {
            "_id": "5cdc0ede5c3dcb04bdb3a972",
            "emp_code": 187,
            "log_id": 361711,
            "punch_time": "2019-05-07T04:00:33.000Z",
            "pin_type": 1,
            "status": 4,
            "__v": 0
        },
        {
            "_id": "5cdc40de5c3dcb04bdb3a972",
            "emp_code": 111,
            "log_id": 361701,
            "punch_time": "2019-05-07T04:00:35.000Z",
            "pin_type": 101,
            "status": 4,
            "__v": 0
        }
    ],
    "pin_type_text": {
        "1": "In Fingerprint",
        "4": "In Card",
        "101": "Out Fingerprint",
        "104": "Out Card"
    }
}  

每行 pin_type 的值是指 pin_type_text 中与其键对应的记录。

我正在使用 AlamofireObjectMapper 创建模型,这是PinTypeText模型:

class PinTypeText : Mappable {

    var inFingerprint: String?
    var inCard: String?
    var outFingerprint: String?
    var outCard: String?

    required init?(map: Map) {

    }

    func mapping(map: Map) {
        self.inFingerprint <- map["1"]
        self.inCard <- map["4"]
        self.outFingerprint <- map["101"]
        self.outCard <- map["104"]
    }  
}  

问题:假设将来pin_type值- 1、4、101、104 在后端发生变化,如何在不更改模型的情况下处理这种情况? 。按照这种模型结构,每次后端模型更改时,我都需要更改模型类

1 个答案:

答案 0 :(得分:2)

您可以在这里使用Codable作为解决方案,

1。。创建一个模型Row,该模型将包含rows的{​​{1}}数组中的单行数据,即

json

在上述模型中,我使用了2个不同的属性-class Row: Decodable { var id: String? var pinType: String? var pinId: Int? enum CodingKeys: String, CodingKey { case id = "_id" case pinId = "pin_type" } }

  1. pinType and pinId将在pinId

  2. 中包含pin_type
  3. row将包含与pinType相对应的实际值。稍后我们将填充该值。

此外,我只使用了pinId的一小部分键。您可以根据需要添加更多内容。

2。。接下来,创建另一个模型row,其中将包含Response中的array,即

Row

在上述模型中,

    class Response: Decodable { var rows: [Row]? enum CodingKeys: String, CodingKey { case rows, pin_type_text } required init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) rows = try values.decodeIfPresent([Row].self, forKey: .rows) let pinTypeText = try values.decodeIfPresent([String:String].self, forKey: .pin_type_text) rows?.forEach({ (row) in if let pinId = row.pinId { row.pinType = pinTypeText?[String(pinId)] } }) } } 中的
  1. rows数组被解析为json

  2. [Row] pinTypeText被解析为dictionary类型。

  3. 列举了
  4. [String:String],使用[Row]pinType在每个row中填充pinId

使用时,需要使用pinTypeText dictionary对象的pinType属性。

Row

如果遇到实施此方法的问题,请告诉我。