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

Creating Custom JSON Mapper in Swift

这里执行两项任务:

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

写下了以下代码并且它的工作完美:

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 是固定的,所以我想在通用模型中转换上面的代码,这样我将传递任何模型,然后它 return 我得到结果。

当我通过字典时,它应该 return 我将在 运行 时间内指定的模型,我想为每个模型制作这个通用模型,以便字典可以转换为任何指定型号。

请提供您宝贵的意见。

**注意: 1.Dont 想使用任何第 3 方库,如 ObjectMapper 等

名字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.

也类似