Swift 单个实体的可编码动态键

Swift codable dynamic keys for single entity

我的JSON:

    "Filters": [
    { "filter": "View by",
      "products": [
        { "id": 1,
          "views": 56700
        },
        {"id": 2,
          "views": 60000
        }
      ]
    },
    { "filter": "Ordered by",
      "products": [
        { "id": 1,
          "orders": 5600
        },
        { "id": 2,
          "orders": 4300
        }
      ]
    }
  ]

到目前为止,以下结构对我有用,但不太好用

struct Filter: Codable {
    let filter: String
    let products: [[String: Int]]
}

是否可以仅为产品对象的某些部分创建通用键结构?

简而言之,是否可以只为 "orders" 和 "views" 而不是 id 应用通用结构?

例如:像这样的东西

struct Filter: Codable {
    let filter: String
    let products: [Product]
}

struct Product: Codable {
    let id: Int
    let _____: [String: Int] // Some unknown variable
}

你可以这样写:

protocol Product: Codable {
    var id: Int {get}
}
struct ProductByView: Product {
    let id: Int
    let views: Int
}
struct ProductByOrder: Product {
    let id: Int
    let orders: Int
}

struct Filter: Codable {
    let filter: String
    let products: [Product]

    init(from decoder: Decoder) throws {
        //...
    }

    func encode(to encoder: Encoder) throws {
        //...
    }
}

但是,实施 Filter.init(from:)Filter.encode(to:) 会有点复杂。

对于您的情况,您可以使用以下简化的解决方法:

struct Product: Codable {
    let id: Int
    let views: Int?
    let orders: Int?
    //... you may need more?
}
struct Filter: Codable {
    let filter: String
    let products: [Product]
}