【问题标题】:Map multiple keys to single coding key swift将多个键快速映射到单个编码键
【发布时间】:2020-05-17 05:47:19
【问题描述】:

我有下面的示例 JSON。有多个项目,但每个项目的键不同,但每个参数都以相同的值结尾,如(ID、名称、url、价格、类别、详细信息)。有什么方法可以将所有这些项目映射到单个模型。

{
"items":[
    {
        "ID":1000,
        "name":"Bosch",
        "URL":"",
        "price":25000,
        "categroy":"washing machines",
        "details":"Bosch 6 kg Fully Automatic Front Load with In-built Heater White"
    },
    {
        "productID":1100,
        "productName":"Panasonic",
        "thumnailURL":"",
        "productPrice":30000,
        "productCategroy":"Air Conditioners",
        "productDetails":"Panasonic 1.5 Ton 3 Star Split AC with PM 2.5 Filter"
    },
    {
        "itemID":1200,
        "itemName":"Whirlpool",
        "itemImageURL":"",
        "itemPrice":15000,
        "commodityCategroy":"Refrigerators",
        "itemDetails":"Whirlpool 190 L Direct Cool Single Door 5 Star "
    },
    {
        "commodityID":1300,
        "commodityName":"Samsung",
        "commodityImageURL":"",
        "commodityPrice":13000,
        "itemCategroy":"TVs",
        "commodityDetails":"Samsung Series 4 80cm (32 inch) HD Ready LED Smart TV "
    }
]

}

【问题讨论】:

  • 您希望使用 Codable 还是可以使用 ObjectMapper 等 3rd 方库。
  • 无第三方库。
  • 要求服务所有者发送更一致、更少冗余和更少拼写错误 (Categroy) 的数据。

标签: swift xcode codable


【解决方案1】:

你可以为JSONDecoder.KeyDecodingStrategy定义.custom(_:)

enum YourCodingKey: String, CodingKey, CaseIterable {
    case id = "ID"
    case name = "name"
    case url = "URL"
    case price = "price"
    case category = "category"
    case details = "details"
}

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .custom { keys in
    YourCodingKey.allCases
        .first { keys.last.unsafelyUnwrapped.stringValue.hasSuffix($0.stringValue)}
        .unsafelyUnwrapped
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2013-03-12
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多