Swift开发-json解析

使用OC开发时,JSON解析方法很多,如可以自己解析,也可以使用JsonModel,MJExtension等第三方,切换到Swift开发后,也还可以通过桥接的方式调用OC的,但这样会略显麻烦,Swift上也提供了直接进行json解析的方案,目前主流的有SwiftyJSON,ObjectMapper,HandyJson,以及swift 4上对JSON解析的原生支持。下面将一一介绍

一.SwiftyJSON

class Animal {
    var name: String?
    var age: Int?
}
 
func swiftyJson(){
        let jsonStr = "{\"name\":\"哈士奇\",\"age\":2}"
        if let jsonData = jsonStr.data(using: .utf8){
            let json = JSON(jsonData)
            let name = json["name"].stringValue
            let age = json["age"].intValue
            let animal = Animal()
            animal.name = name
            animal.age = age
            print("swiftyJson: name: \(name),age: \(age)")
        }
}

这种解析结构明确,模型转换需要手动编码

二.ObjectMapper

class Animal: Mappable {
    var name: String?
    var age: Int?
    required init?(map: Map){
         
    }
    func mapping(map: Map) {
        name <- map["name"]
        age <- map["age"]
    }
}
 
func objectMapper(){
        let jsonStr = "{\"name\":\"哈士奇\",\"age\":2}"
        let animal = Mapper<Animal>().map(JSONString: jsonStr)
        let name = animal?.name!
        let age = animal?.age!
        print("swiftyJson: name: \(name!),age: \(age!)")
        let JSONString =  user?.toJSONString()
        print(JSONString!)
 }

ObjectMapper模型转换需要手动编码

三.HandyJSON

class Animal: HandyJSON {
    var name: String?
    var age: Int?
    required init() {}
}
 
func handyJSON(){
      let jsonStr = "{\"name\":\"哈士奇\",\"age\":2}"
      if let animal = Animal.deserialize(from: jsonStr) {
          let name = animal.name!
          let age = animal.age!
          print("handyJSON: name: \(name),age: \(age)")
      }
}

使用HandyJson需要继承HandyJSON,不需要手动编码就可以完成模型转换,比较简单。 

四. 原生JSON解析,Encoder/Decoder

class Bank: Codable {
    var name: String?
    var address: String?
}
 
class Teacher: Codable {
    var school: String?
    var banks: Array<Bank>?
}
 
 func nativeJson(){
        let jsonStr = "{\"banks\":[{\"name\":\"中国银行\",\"address\":\"北京市朝阳区XXX\"},{\"name\":\"中国农业银行\",\"address\":\"北京市海淀区XXX\"}],\"school\":\"北京四中\"}"
        let jsonData = jsonStr.data(using: .utf8)
        let decoder = JSONDecoder()
        do {
            let animal = try decoder.decode(Teacher.self, from: jsonData!)
            let school = animal.school!
            print("nativeJson: name: \(school)")
            for bank in animal.banks! {
                 print("nativeJson: name: \(bank.name!),address: \(bank.address!)")
            }
        } catch {
            // 异常处理
        }
 }

系统原生的解析也可以进行模型转换,结果如下

通过对上面四种解析方式的比较,3,4种比较符合我们平时开发的需求,都可以进行模型转换,同时对三,四进行性能分析,执行解析1万次,系统原生的性能稍好

所以在实际的开发中,可以根据项目情况优先选择系统原生的jSON解析,前提是在Swift 4以上才支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值