有時(shí)候服務(wù)器返回的某個(gè)字段的內(nèi)容類型可能是不確定的
- 當(dāng)時(shí)給出的解決方案是實(shí)現(xiàn)
kj_modelValue
或者kj_didConvertToModel
方法,根據(jù)實(shí)際需求自定義JSON的解析邏輯 - 如果不確定的內(nèi)容是要轉(zhuǎn)成模型景鼠,KakaJSON有更簡(jiǎn)單的實(shí)現(xiàn)方案
1.舉例
struct Book: Convertible {
var name: String = ""
var price: Double = 0.0
}
struct Car: Convertible {
var name: String = ""
var price: Double = 0.0
}
struct Pig: Convertible {
var name: String = ""
var height: Double = 0.0
}
struct Dog: Convertible {
var name: String = ""
var weight: Double = 0.0
}
struct Person: Convertible {
var name: String = ""
var pet: Any?
// 這里用`NSArray`称勋、`NSMutableArray`也行
var toys: [Any]?
// 這里用`NSDictionary`悠反、`NSMutableDictionary`也行
var foods: [String: Any]?
func kj_modelType(from jsonValue: Any?, _ property: Property) -> Convertible.Type? {
switch property.name {
case "toys": return Car.self // `toys`數(shù)組存放`Car`模型
case "foods": return Book.self // `foods`字典存放`Book`模型
case "pet":
if let pet = jsonValue as? [String: Any], let _ = pet["height"] {
// 如果`pet`屬性的`jsonValue`是個(gè)字典卸亮,并且有`height`這個(gè)key瞧哟,就轉(zhuǎn)為`Pig`模型
return Pig.self
}
// 將`jsonValue`轉(zhuǎn)為`Dog`模型賦值給`pet`屬性
return Dog.self
default: return nil
}
}
}
// 測(cè)試數(shù)據(jù)
let name = "Jack"
let dog = (name: "Wang", weight: 109.5)
let pig = (name: "Keke", height: 1.55)
let books = [
(name: "Fast C++", price: 666.0),
(name: "Data Structure And Algorithm", price: 1666.0)
]
let cars = [
(name: "Benz", price: 100.5),
(name: "Bently", price: 300.6)
]
// JSON數(shù)據(jù)
let json: [String: Any] = [
"name": name,
"pet": ["name": dog.name, "weight": dog.weight],
// "pet": ["name": pig.name, "height": pig.height],
"toys": [
["name": cars[0].name, "price": cars[0].price],
["name": cars[1].name, "price": cars[1].price]
],
"foods": [
"food0": ["name": books[0].name, "price": books[0].price],
"food1": ["name": books[1].name, "price": books[1].price]
]
]
let person = json.kj.model(Person.self)
print("name:\(person.name) pet:\(person.pet!)")
guard let toys = person.toys, let foods = person.foods else {
return
}
for car: Car in toys as! [Car] {
print("car:\(car.name) \(car.price)")
}
for (key, value) in foods {
print("key:\(key) value:\(value)")
}
/*
name:Jack pet:Dog(name: "Wang", weight: 109.5)
car:Benz 100.5
car:Bently 300.6
key:food0 value:Book(name: "Fast C++", price: 666.0)
key:food1 value:Book(name: "Data Structure And Algorithm", price: 1666.0)
*/
Swift 字典轉(zhuǎn)模型(KakaJSON) ---1.基本用法
Swift 字典轉(zhuǎn)模型(KakaJSON) ---2.數(shù)據(jù)類型
Swift 字典轉(zhuǎn)模型(KakaJSON) ---3.key處理
Swift KakaJSON 05.---模型轉(zhuǎn)字典
Swift KakaJSON 06.---Coding/歸檔/解檔