Ios 将JSON映射到数据模型,需要从动态键获取嵌套的电子邮件值
我正在使用ObjectMapper将数据映射到我的模型,我需要在模型中填充电子邮件属性。棘手的部分是,根据用户注册的方式(使用电子邮件或Facebook/Google帐户),持有嵌套电子邮件属性的密钥将反映他们的注册选择。下面我将给出一个JSON数据示例 如果是定期电子邮件注册:Ios 将JSON映射到数据模型,需要从动态键获取嵌套的电子邮件值,ios,json,swift,model,swift4,Ios,Json,Swift,Model,Swift4,我正在使用ObjectMapper将数据映射到我的模型,我需要在模型中填充电子邮件属性。棘手的部分是,根据用户注册的方式(使用电子邮件或Facebook/Google帐户),持有嵌套电子邮件属性的密钥将反映他们的注册选择。下面我将给出一个JSON数据示例 如果是定期电子邮件注册: "local": { "email": "testclient1@mail.com", "password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2s
"local": {
"email": "testclient1@mail.com",
"password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2sAxES",
"passwordConf": "$2a$10$ZqqzsLfQXmoEXnwL3v2sAxES"
}
"facebook": {
"id": "10287",
"email": "jcstclair@icloud.com"
}
"google": {
"id": "11514716",
"email": "parkhomeyp@gmail.com"
}
对于Facebook或google的常规注册:
"local": {
"email": "testclient1@mail.com",
"password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2sAxES",
"passwordConf": "$2a$10$ZqqzsLfQXmoEXnwL3v2sAxES"
}
"facebook": {
"id": "10287",
"email": "jcstclair@icloud.com"
}
"google": {
"id": "11514716",
"email": "parkhomeyp@gmail.com"
}
你明白了。正如你所看到的,为了在get电子邮件中访问,密钥必须与3个选项(本地、facebook或谷歌)中的一个不同。这个问题的一个解决方案是使用枚举。我将发布模型的相关部分
import ObjectMapper
struct Client: Mappable {
enum EmailType: String {
case local = "local"
case facebook = "facebook"
case google = "google"
}
var emailType: String?
init?(map: Map) {}
mutating func mapping(map: Map) {
emailType <- map["\(EmailType.RawValue()).email"]
}
导入对象映射器
结构客户端:可映射{
枚举电子邮件类型:字符串{
case local=“local”
case facebook=“facebook”
case google=“谷歌”
}
var电子邮件类型:字符串?
init?(map:map){}
变异函数映射(映射:映射){
emailType我建议您创建单独的模型类,因为它很容易为将来的更新进行修改
您所做的不正确。您刚刚创建了EmailType
的RawValue
对象,它将始终返回空
emailType <- map["\(EmailType.RawValue()).email"]
您得到的输出是
.电邮
对于Map
我没有更好的主意,但您需要的是告诉我如何尝试每种enum来获取数据
我的建议是,您需要在emailType
字符串中选中nil
试试这个代码
emailType <- (map["\(EmailType.local).email"] ?? map["\(EmailType. facebook).email"] || map["\(EmailType. google).email"] )
Pl如果您仍然面临问题,请告诉我。谢谢!我尝试了这段代码,但它不起作用,结果出现错误,“无法将'Map'类型的值转换为预期的参数类型'Bool”,关于如何修复这个问题有什么想法吗?顺便说一句,你创建一个单独的模型类是什么意思?一个单独的电子邮件模型??哇,这个工作非常好,我注意到你做了一个小的打字错误,因为你放了EmailType.facebook两次,但在我修复之后,它工作得非常有魅力!非常感谢!