首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JSON映射到数据模型,需要从动态键获得嵌套的电子邮件值

将JSON映射到数据模型,需要从动态键获得嵌套的电子邮件值
EN

Stack Overflow用户
提问于 2018-01-08 06:45:44
回答 1查看 201关注 0票数 0

我正在使用ObjectMapper将数据映射到我的模型,我需要在模型中填充一个电子邮件属性。棘手的部分在于,取决于用户如何注册(无论是用电子邮件注册,还是使用帐户注册),持有嵌套电子邮件属性的密钥将反映他们的注册选择。下面我将给出一个JSON数据的示例。

就定期电子邮件登记而言:

代码语言:javascript
复制
"local": {
            "email": "testclient1@mail.com",
            "password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2sAxES",
            "passwordConf": "$2a$10$ZqqzsLfQXmoEXnwL3v2sAxES"
        }

就Facebook或google的常规注册而言:

代码语言:javascript
复制
"facebook": {
            "id": "10287",
            "email": "jcstclair@icloud.com"
        }

"google": {
            "id": "11514716",
            "email": "parkhomeyp@gmail.com"
        }

你明白了吧。正如您所看到的,为了在get电子邮件中访问,键必须是不同的,才能匹配3种选择(本地的、facebook的或谷歌的)。解决这个问题的一个办法是使用枚举。我会贴出我的模型的相关部分。

代码语言:javascript
复制
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"]
    }

其思想是使用字符串插值,以便它将找到与上面的枚举匹配。.email允许我获得嵌套属性。这似乎是一个逻辑解决方案,但它为属性返回了emailType零,因此很明显,它没有正确地映射它。

现在您已经看到了我的JSON和我的数据模型,您认为访问email属性的最佳方法是什么,不管它有哪种类型的密钥。我想避免为本地,fb和谷歌创建3个属性,如果可能的话,我希望它是简洁的,但动态的。谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-08 09:16:10

我建议创建单独的模型类,因为将来的更新很容易修改。

你所做的不对。您刚刚创建了EmailTypeRawValue对象,它将始终返回为空。

代码语言:javascript
复制
    emailType       <- map["\(EmailType.RawValue()).email"]

如果你打印

代码语言:javascript
复制
 print("\(EmailType.RawValue()).email")

得到的输出是

.email

对于Map,我没有什么更好的主意,您需要的是告诉您,尝试每一种情况下获取数据

我的建议是您需要检查nil字符串中的emailType

试试这段代码

代码语言:javascript
复制
    emailType       <- (map["\(EmailType.local).email"] ?? map["\(EmailType. facebook).email"] ||  map["\(EmailType. google).email"] )

希望这对你有帮助

编辑\更新

我在Mappble上做了研究,发现下面的内容对你有帮助

因为Map没有返回非可选值,所以您得到了错误。因此,要摆脱它,您需要使用map.JSON

代码语言:javascript
复制
   if map.JSON[EmailType.local.rawValue] != nil {
        emailType       <-  (map["\(EmailType.local).email"] )
    } else if map.JSON[EmailType.facebook.rawValue] != nil {
        emailType       <-  (map["\(EmailType.facebook).email"] )
    } else if map.JSON[EmailType. google.rawValue] != nil {
        emailType       <-  (map["\(EmailType.google).email"] )
    }

如果你还面临问题,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48145463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档