使用ObjectMapper在Dictionary Swift中解析Dictionary

时间:2017-01-06 05:42:38

标签: ios json swift dictionary objectmapper

我的旧JSON结构是这样的:

{
"parameters": {
"customerId": 9,
"from": "2014-06-05T14:00:00",
"until": "2014-06-05T15:00:00",
"km": 20,
"insurance": false
},
"estimatesPerCategory": {
  "2": {
  "timeCost": 5,
  "kmCost": 6,
  ... 
 }

要解析JSON,我使用ObjectMapper。 这段代码非常有效:

if let myObject = Mapper<CostEstimateResult>().map(JSONObject: JSON) {

}

CostEstimateResult类看起来像这样。

class CostEstimateResult : NSObject, Mappable {

var parameters:CostEstimateParameters?
var estimatesPerCategory:[String: CostEstimate]? // CostEstimate.id -> CostEstimate


override init() {}

required convenience init?(map: Map) {
    self.init()
    self.mapping(map: map)
}

 func mapping(map: Map) {
    estimatesPerCategory <- map["estimatesPerCategory"]
    parameters <- map["parameters"]
 }
}

最后但并非最不重要的是我对CostPerCategory的CostEstimate类

class CostEstimate : NSObject, Mappable {

var timeCost:NSNumber?
...
override init() {}

required convenience init?(map: Map) {
    self.init()
    self.mapping(map: map)
}

func mapping(map: Map) {
    timeCost <- map["timeCost"]
    ...
    }
}

这很有效。 CostEstimateResult中的映射器将在CostEstimates中调用映射器,并获取我的解析数据。

现在我改变了JSON结构:

{
"parameters": {
//same like before
},
"estimatesPerCategory": {
 "2": {
  "total": {
    "preTax": {
      "value": 1,
      "text": "1,00 €"
    },
    "configTax": false
  }, 
 "3": {
     //same...
   }
 }
}

在我看来,基本结构没什么变化。 estimatesPerCategory仍然是同一个字典。 estimatesPerCategory背后的数据已更改,好的。

问题是,当我调用映射器...Mapper<CostEstimateResult>().map...时,参数将被解析,而不是costEstimates。 func mapping中的CostEstimate不再调用

长话短说:似乎estimatesPerCategoryCostEstimateResult的类型随json结构而变化。我无法弄清楚我需要哪种类型。

1 个答案:

答案 0 :(得分:0)

现在使用新的JSON结构,您的Class CostEstimate结构将被更改,并且需要创建新的类PreTax

class CostEstimateResult : NSObject, Mappable {

    var parameters:CostEstimateParameters?
    var estimatesPerCategory:[String: CostEstimate]? // CostEstimate.id -> CostEstimate

    override init() {}

    required convenience init?(map: Map) {
        self.init()
        self.mapping(map: map)
    }

    func mapping(map: Map) {
        estimatesPerCategory <- map["estimatesPerCategory"]
    }
}


class CostEstimate : NSObject, Mappable {
    var total:totalTax?

    override init() {}

    required convenience init?(map: Map) {
        self.init()
        self.mapping(map: map)
    }

    func mapping(map: Map) {
        total <- map["total"]
    }
}

class totalTax : NSObject, Mappable {
    var preTax:PreTax?
    var configTax:Bool?

    override init() {}

    required convenience init?(map: Map) {
        self.init()
        self.mapping(map: map)
    }

    func mapping(map: Map) {
        preTax <- map["preTax"]
        configTax <- map["configTax"]
    }
}

class PreTax : NSObject, Mappable {

    var value:NSNumber?
    var text:String?

    override init() {}

    required convenience init?(map: Map) {
        self.init()
        self.mapping(map: map)
    }

    func mapping(map: Map) {
        value <- map["value"]
        text <- map["text"]
    }
}