2017-06-28 23 views
3

Swift 3.1でObjectMapperを使用してJSON応答をモデルにマッピングしています。ObjectMapper - ネストされた動的キー

私はこの複雑なJSONレスポンスをダイナミックキーでマッピングしようとしています。私が間違っていることについていくつかのフィードバックを得たいと考えています。

グループには進捗状況に関する統計情報があります。それは数年と数ヶ月に分解された統計を持っています。 1年以内の各月に結果、ROIと勝利があります。 ROIとwinはちょうどパーセンテージですが、結果のキーは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 
     } 
    } 
} 

私のモデル私は私が手

応答がnilとして、私のGroupResponseクラスの統計プロパティを持っている何を得る

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

これを達成するために他の方法をとることができますか、これを実現するために私の実装を変更することができますか?

答えて

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? 
} 

おそらくこの問題に対するより良い解決策がありますが、これは私が今固執していることです。

うまくいけば、これが役に立ちます。

関連する問題