【发布时间】: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