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

Posted

技术标签:

【中文标题】将 JSON 映射到数据模型,需要从动态键中获取嵌套的电子邮件值【英文标题】:Mapping JSON to data models, need to get nested email value from a dynamic key 【发布时间】:2018-01-08 06:45:44 【问题描述】:

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

在常规电子邮件注册的情况下:

"local": 
            "email": "testclient1@mail.com",
            "password": "$2a$10$ZqqsS5F1QXmoEXnwL3v2sAxES",
            "passwordConf": "$2a$10$ZqqzsLfQXmoEXnwL3v2sAxES"
        

如果是常规的 Facebook 或 google 注册:

"facebook": 
            "id": "10287",
            "email": "jcstclair@icloud.com"
        

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

你明白了。如您所见,密钥必须不同才能匹配 3 个选项之一(本地、facebook 或 google),以便在获取电子邮件中进行访问。解决此问题的一种方法是使用枚举。我将发布我的模型的相关部分。

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 属性返回 nil,因此显然它没有正确映射它。

既然您已经看到了我的 JSON 和我的数据模型,那么您认为获取电子邮件属性的最佳方式是什么,无论它具有哪种类型的密钥。如果可能的话,我想避免为 local、fb 和 google 创建 3 个属性,我希望它简洁而动态。感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

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

    emailType       <- map["\(EmailType.RawValue()).email"]

如果你打印

 print("\(EmailType.RawValue()).email")

你得到的输出是

.email

我对@9​​87654325@ 没有更好的主意,您需要告诉尝试每种枚举情况以获取数据

我的建议是你需要检查nil in emailType String

试试这个代码

    emailType       <- (map["\(EmailType.local).email"] ?? map["\(EmailType. facebook).email"] ||  map["\(EmailType. google).email"] )

希望对你有帮助

编辑\更新

我研究了Mappble,发现以下对你有帮助

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

   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"] )
    

如果您仍然遇到问题,请告诉我。

【讨论】:

谢谢!我尝试了这段代码,但它没有用,我最终得到了这个错误,“无法将'Map'类型的值转换为预期的参数类型'Bool”,关于如何解决这个问题的任何想法?顺便说一句,您创建一个单独的模型类是什么意思?电子邮件的单独模型?? 哇,这效果很好,我注意到你犯了一个小错字,因为你输入了两次 EmailType.facebook,但在我修复它之后它就像一个魅力!非常感谢!

以上是关于将 JSON 映射到数据模型,需要从动态键中获取嵌套的电子邮件值的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 映射到 java 模型类

如何从 Scala 中的映射键中获取值的常见元素?

BigQuery 从 JSON 文件键中获取列

如何仅从一个键中过滤对象并将其作为 json 返回?

Firebase Documentsnapshot 映射到 Flutter 中的 Json 对象

将核心数据行从一个表(实体)映射到 [CLLocation] 数组?