继MJExtion之后的KaKaJson是swift语言中的数据解析库,他也是传奇MJ大神的产物,下面我介绍下他的基本使用方法
pod 导入
# 模型转换框架
pod 'KakaJSON', '1.1.2'
1.首页先创建一个BaseMode
继承NSObject ,再遵循KakaJson的代理Convertible,代码如下
import UIKit
import KakaJSON
protocol Copyable: Codable {
func clone() -> Self
}
extension Copyable {
func clone() -> Self {
let encoder = JSONEncoder()
guard let data = try? encoder.encode(self) else {
fatalError("encode失败")
}
let decoder = JSONDecoder()
guard let target = try? decoder.decode(Self.self, from: data) else {
fatalError("decode失败")
}
return target
}
}
class BaseModel: NSObject,Convertible {
func kj_modelKey(from property: Property) -> ModelPropertyKey {
return property.name
}
required override init(){}
}
2. 创建一个CostomModel 继承 BaseMode
import UIKit
import KakaJSON
class CostomModel: BaseModel {
var nickname = ""
var age : Int = 0
var sex = ""
var userDict : [String:Any] = [:]
var userModel : UserModel?
//映射属性 userModel 为模型属性, user_Model 为后台json给的字段
override func kj_modelKey(from property: Property) -> ModelPropertyKey {
switch property.name{
case "userModel": return "user_Model"
default:return property.name
/*
驼峰 -> 下划线
// 由于开发中可能经常遇到`驼峰`映射`下划线`的需求,KakaJSON已经内置了处理方法
// 直接调用字符串的underlineCased方法就可以从`驼峰`转为`下划线`
// `nickName` -> `nick_name`
return property.name.kj.underlineCased()
*/
/*
下划线 -> 驼峰
// `nick_name` -> `nickName`
return property.name.kj.camelCased()
*/
}
}
}
class UserModel:BaseModel{
var userName = ""
var userAge : Int = 0
var userSex = ""
}
class ArrayModel:BaseModel{
var name:String = ""
var price:String = ""
}
3.转为nsobjcet模型对象kj.model , 转为数组模型对象kj.modelArray
let jsonDict:[String:Any] = [
"nickname":"黄世文",
"sex":"男",
"age":"27",
"user_Model":[
"userName":"黄世文",
"userSex":"男",
"userAge":"27",
]
]
let ArrayDict : [[String:Any]] = [
["name":"A","price":"100"],
["name":"B","price":"200"],
["name":"C","price":"300"],
]
let model = jsonDict.kj.model(CostomModel.self)
let arrays = ArrayDict.kj.modelArray(ArrayModel.self)
4.转为json对象kj.JSONObject() 转为json字符串kj.JSONString()
for model:ArrayModel in arrays{
print(model.price)
//将model转为字典
let dict = model.kj.JSONObject()
let dictString = model.kj.JSONString()
print("json字典\(dict)+json字符串\(dictString)")
}
5.继承使用Convertible方法直接调用方法
// 如果你想把JSON数据转换到原本已经创建好的模型实例上,可以使用convert方法
struct Cat: Convertible {
var name: String = ""
var weight: Double = 0.0
}
let json: [String: Any] = [
"name": "Miaomiao",
"weight": 6.66
]
var cat = Cat()
// .kj_m是.kj的mutable版本,牵扯到修改实例本身都是.kj_m开头
cat.kj_m.convert(from: json)
print("name: \(cat.name) weight\(cat.weight)")
// name: Miaomiao weight6.66