ObjectMapper - 嵌套动态键

Posted

技术标签:

【中文标题】ObjectMapper - 嵌套动态键【英文标题】:ObjectMapper - nested dynamic keys 【发布时间】:2017-06-28 15:19:21 【问题描述】:

我正在使用 Swift 3.1 编写,使用 ObjectMapper 将我的 JSON 响应映射到我的模型。

我正在尝试使用动态键映射这个相当复杂的 JSON 响应,并希望得到一些关于我做错了什么的反馈。

一个小组有关于它的进步的统计数据。它的统计数据细分为年和月。一年内的每个月都有结果、投资回报率和胜利。投资回报率和胜利只是百分比,但结果键是固定的,下面的键是 1-5,然后是某个整数作为值。

我的 JSON

"stats": 
    "2017": 
        "1": 
            "results": 
                "1": 13,
                "2": 3,
                "3": 1,
                "4": 1,
                "5": 0
            ,
            "roi": 0.40337966202464975,
            "win": 0.8181818181818182
        ,
        "2": 
            "results": 
                "1": 13,
                "2": 5,
                "3": 1,
                "4": 2,
                "5": 1
            ,
            "roi": 0.26852551067922953,
            "win": 0.717948717948718
        
    

我的模型

class GroupResponse: Mappable 
    var stats: [String: [String: StatsMonthResponse]]?

    func mapping(map: Map) 
        stats   <- map["stats"]
    


class StatsMonthResponse: Mappable 
    var tips: [String: Int]?
    var roi: Double?
    var win: Double?

    func mapping(map: Map) 
        tips    <- map["results"]
        roi     <- map["roi"]
        win     <- map["win"]
    

我得到了什么

我得到的响应在我的 GroupResponse 类中具有 stats 属性,为 nil。

我可以采取哪些其他方法来完成此任务,或者更改我的实现以完成此任务?

【问题讨论】:

【参考方案1】:

解决方案

我通过手动映射 JSON 解决了​​我的问题。

class GroupResponse: Mappable 

    var stats: [String: StatsYear]?

    func mapping(map: Map) 
        stats   <- map["stats"]
    
 

class StatsYear: Mappable 

    var months: [String: StatsMonth] = [:]

    override func mapping(map: Map) 

        for (monthKey, monthValue) in map.JSON as! [String: [String: Any]] 

            let month = StatsMonth()

            for (monthKeyType, valueKeyType) in monthValue 

                if monthKeyType == "results" 
                    let tipResultDict = valueKeyType as! [String: Int]

                    for (result, tipsForResult) in tipResultDict 
                        month.tips[result] = tipsForResult
                    
                
                else if monthKeyType == "roi" 
                    month.roi = valueKeyType as? Double
                
                else if monthKeyType == "win" 
                    month.win = valueKeyType as? Double
                
            
            months[monthKey] = month
        
    


class StatsMonth 

    var tips: [String: Int] = [:]
    var roi: Double?
    var win: Double?

这个问题可能有更好的解决方案,但这是我现在坚持的。

希望这会有所帮助!

【讨论】:

感谢您的建议。我正在经历类似的事情,这非常有帮助。 很高兴能帮上忙! 非常感谢!

以上是关于ObjectMapper - 嵌套动态键的主要内容,如果未能解决你的问题,请参考以下文章

ObjectMapper 和具有唯一键的数组

Alamofire,Objectmapper,Realm:嵌套对象

Swift - 嵌套对象的映射 (Objectmapper)

如何通过 objectMapper 和 Alamofire 发布嵌套的 json?

NSPredicate 嵌套字典动态键

如何解析具有动态键名的嵌套 json