在 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
.
也类似
这里执行两项任务:
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
.