在Swift中创建自定义JSON映射器

时间:2018-08-05 19:43:45

标签: ios generics swift4 codable decodable

这里执行两项任务:

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等。

1 个答案:

答案 0 :(得分:1)

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

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) } } 也是如此。