Используйте ObjectMapper для разбора словаря в словаре Swift

Моя старая структура 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"]
 }
}

И наконец, что не менее важно, мой класс 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... параметры будут проанализированы, но не оценки стоимости. func mapping в CostEstimate больше не звонить.

Короче говоря: похоже, что тип estimatesPerCategory в CostEstimateResult меняется со структурой JSON. Я не могу понять, какой тип мне нужен.

1 ответ

Теперь с новой структурой 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"]
    }
}
Другие вопросы по тегам