将 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 将数据映射到我的模型,我需要在我的模型中填写电子邮件属性。棘手的部分是,根据用户注册的方式(使用 email 或 Facebook/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】:我建议您创建单独的模型类,因为它很容易为将来的更新而修改
你所做的不正确。您刚刚创建了 EmailType
的 RawValue
对象,它将始终返回空
emailType <- map["\(EmailType.RawValue()).email"]
如果你打印
print("\(EmailType.RawValue()).email")
你得到的输出是
我对@987654325@ 没有更好的主意,您需要告诉尝试每种枚举情况以获取数据
我的建议是你需要检查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 映射到数据模型,需要从动态键中获取嵌套的电子邮件值的主要内容,如果未能解决你的问题,请参考以下文章