json - 如何在 Swift 中定义到同一模型对象的不同 JSON 映射?

标签 json swift mapping

我正在编写一个 Swift 应用程序,它具有搜索功能,可以从不同的数据库/源中查找类似的数据。换句话说,这些不同来源的结果应该由相同的模型对象支持。

鉴于每个在线 JSON 源将返回代表相同模型的 JSON 数据,但每个在线源之间的 JSON 略有不同。在不同源之间编码/解码到同一模型的最佳方法是什么?

最佳答案

假设您的通用模型对象需要以下值:(fullName、age)

您有 02 个数据源,它们返回相同信息的类型略有不同:

来源 01

{
    "firstName": "John",
    "lastName": "Doe",
    "age": "25"
}

来源 02

{
    "fullName": "Jane Doe"
    "dob": "10-02-1990"
}

只要您知道给定的源会产生固定的响应,我就会建议每个响应使用一个模型类,如下所示:

响应01

struct Reponse01: Decodable {
    let _firstName: String
    let _lastName: String
    let _age: Int
}

响应02

struct Reponse02: Decodable {
    let _fullName: String
    let _dob: Date
}

然后定义一个通用协议(protocol),可用于从您的各个模型结构中提取必要的信息:

protocol BaseModelDerivable {
    var fullName: String { get }
    var age: Int { get }
}

然后让您的各个响应类实现此接口(interface),同时定义如何返回计算属性的方法。例如:

struct Reponse01: Decodable {
    let _firstName: String
    let _lastName: String
    let _age: Int
}

extension Reponse01: BaseModelDerivable {
    var fullName: String { 
        get { return "\(_firstName) \(_lastName)" }
    }
    var age: Int {
        get { return _age }  
    }
}

这样,您就可以使用 BaseModelDerivable 拥有不同模型的异构集合。协议(protocol)(在 [BaseModelDerivable] 数组内)。 从某些存储中检索时,您可以通过查询每个单独的项目并将其存储在 [BaseModelDerivable] 中来重新填充此数组。收藏。

注意:虽然可能还有其他方法可以做到这一点,例如创建一个名为 BaseModel 的结构体。并编写多个初始化程序来从这些响应中的任何一个创建该对象,当源很多时,您的模型对象将开始充斥着初始化程序。

struct BaseModel {
    let fullName: String
    let age: Int

    convenience init(aResponse: Response01) {
        let fullName = "\(aResponse.firstName) \(aResponse.lastName)"
        let age = aResponse.age
        init(fullName: fullName, age: age)
    }

    // another init for Response02

    // how many more??
}

注意:您也可以考虑写 Converter<T>接受任何不同响应并输出 BaseModel 的类值。

有很多方法可以做到这一点。希望这会有所帮助。

关于json - 如何在 Swift 中定义到同一模型对象的不同 JSON 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526869/

相关文章:

swift - 在 SwiftUI 中拥抱 subview

java - Hibernate:在多对一类映射中设置默认值

ios - Spritekit 游戏无法在 Xcode 6.3 上构建无法将模块 'SpriteKit' 加载为 'Spritekit'

ios - UILabel子类的TextColor

c# - Entity Framework 不可为空的列映射到可为空的实体属性

json - Jackson JSON 到 Java 映射,用于具有不同数据类型的相同属性

json - 在 Json.toJson() 之后 Play ebean 的 Date 字段格式

json.Unmarshal 不返回解码数据

c# - 尝试反序列化从 Exception 继承的类时 Json.net 失败

php - 写入文件时停止 PHP 转义 JSON 字符串