【问题标题】:Creating Custom JSON Mapper in Swift在 Swift 中创建自定义 JSON 映射器
【发布时间】:2018-08-05 19:43:45
【问题描述】:

这里执行两个任务:

1.将字典转换为模型对象
2. 将模型对象转换为字典

写下以下代码并完美运行:

JsonMapper.Swift

class JsonMapper
{
    /**
     *@Method     : decodeUser
     *@Param      : Dictionary of type [String:Any]
     *@ReturnType : User  ( which is model )
     *@Description: Responsible for mapping Dictionary to Model object
     */
    func decodeUser(userDict:[String:Any]) -> User?
    {
        let decoder = JSONDecoder()
        var objUser: User?
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: userDict, options: JSONSerialization.WritingOptions.prettyPrinted)
            objUser = try decoder.decode(User.self, from: jsonData)
            print("✅ User Object: \n",objUser)
        } catch {
            print("❌ Error",error)
        }

        return objUser ?? User(id: "", type: “”,salary:””)
    }

    /**
     *@Method     : encodeUser
     *@Param      : User
     *@ReturnType : Dictionary of type [String:Any]
     *@Description: Responsible for mapping Model object User to Dictionary
     */
    func encodeUser(modelObj:User) -> [String:Any]
    {
        let encoder = JSONEncoder()
        var objProfileDict = [String:Any]()
        do {
            let data = try encoder.encode(modelObj)
            objUserDict = (try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any])!
            print("✅ json dictionary: \n",objProfileDict)
        }
        catch {
           print("❌ Error \(error)")
        }

        return objUserDict
    }

}

用户模型:

struct User:Codable
{
    let id           : String
    let type         : String
    let salary       : String

}

上面的代码工作得很好,没问题。

现在的问题是: 1. 每次我需要将 Dictionary 转换为任何模型时,在这里你可以看到 Model User 是固定的,所以我想将上面的代码转换为通用模型,这样,我将传递任何模型,然后它返回结果。

当我通过 Dictionary 时,它应该返回我将在运行时指定的模型,我想为每个模型创建这个通用模型,以便 Dictionary 可以转换为任何指定的模型。

请提供您宝贵的意见。

**注意: 1.不想使用任何第三方库,如 ObjectMapper 等。

【问题讨论】:

  • @vadian,你能帮我解决这个问题吗,或者你可以建议我任何链接,以便我可以增强上面的代码。谢谢
  • 我会使用嵌入式 Swift Codable 协议,我认为您的实现没有任何优势。
  • 您的 cmets 和问题建议您将对象与 JSON 相互转换,但上面的代码将对象与 [String: Any] 相互转换,这不是 JSON。目标是什么?如果是创建和使用 JSON,那么正如 Martin 所说,只需使用 Codable。这就是它的作用(你已经在使用它了)。目前尚不清楚 JSONSerialization 步骤的用途。
  • @RobNapier 感谢您的建议,但我想创建一个通用方法将任何字典值映射到模型对象,我不想像我一样指定模型名称(通过使用用户),所以为此我想创建一个通用方法

标签: ios generics swift4 codable decodable


【解决方案1】:

JsonMapper 的名称在这里具有误导性。你真正的意思是字典映射器。你的方法很好。如果您希望它是通用的,只需传递类型。我可能会这样做:

extension JSONDecoder  {
    /**
     *@Method     : decodeUser
     *@Param      : Dictionary of type [String:Any]
     *@ReturnType : User  ( which is model )
     *@Description: Responsible for mapping Dictionary to Model object
     */
    func decode<T: Decodable>(_ type: T.Type, from dictionary: [String: Any]) throws -> T
    {
        let jsonData = try JSONSerialization.data(withJSONObject: dictionary)
        return try decode(T.self, from: jsonData)
    }
}

JSONEncoder 也是如此。

【讨论】:

  • 感谢@Rob Napier 的宝贵意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2018-03-17
  • 1970-01-01
  • 2016-12-14
  • 2015-12-23
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多