Используйте 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"]
}
}