Ios 将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

我正在使用ObjectMapper将数据映射到我的模型,我需要在模型中填充电子邮件属性。棘手的部分是,根据用户注册的方式(使用电子邮件或Facebook/Google帐户),持有嵌套电子邮件属性的密钥将反映他们的注册选择。下面我将给出一个JSON数据示例

如果是定期电子邮件注册:

"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两次,但在我修复之后,它工作得非常有魅力!非常感谢!