Swift中的JSON解析选择
2020-07-16 本文已影响0人
左说方言
起因:新开Swift项目,在SwiftyJSON、ObjectMapper、HandyJSON、Codable选择一个做项目的JSON解析。
主要对这些框架进行了以下两点的考量
1.正常的使用中、客户端的属性值和接口返回的key是一一对应的,我们不应该重复的写映射关系,
2.如果服务器返回了错误的类型,是否能进行了一些容错处理。(age定义为String类型,但服务端返回Int类型)
结论:基于以上两点,最终选择HandyJSON。
SwiftyJSON
SwiftyJSON的使用:
let jsonString = "{\"name\":\"jsonNmae\",\"age\":20,\"someInt\":30}"
let jsonData = jsonString.data(using: .utf8)!
let swiftyJson = try! JSON(data: jsonData)
print(swiftyJson.type)
print("name:\(swiftyJson["name"])")
print(swiftyJson["age"])
print(swiftyJson["age"].string as Any)
print("sex:\(swiftyJson["sex"])")
SwiftyJSON
没有选择SwiftyJSON的原因:
1.SwiftyJSON并没有把数据转换成model类,如果没有对照接口文档开发,将不知道这个接口返回了那些字段。
2.如果我使用了错误的类型,它并没有做太多的处理,返回了nil。
Codable
Codable的使用
class CodableModel1: Codable {
var name = ""
var someInt = 0
var age = ""
}
do {
let codableModel = try JSONDecoder().decode(CodableModel1.self, from: jsonData)
print(codableModel.name)
print(codableModel.age)
print(codableModel.someInt)
} catch let error {
print(error)
}
Codable
Codable 进行了model化,但Codable遇到了同样的问题:
如果我使用了错误的类型,Codable没有做任何处理,并且会导致解析失败,整个model类无法初始化,如果是粗心的程序员,可能会导致crash。
ObjectMapper
ObjectMapper的使用
class MapModel: Mappable {
required init?(map: Map) {}
func mapping(map: Map) {
name <- map["name"]
age <- map["age"]
}
var name = ""
var age = ""
var someInt = 0
}
let mapModel = MapModel(JSONString: jsonString)!
print(mapModel.age)
print(mapModel.name)
print(mapModel.someInt)
ObjectMapper
没有选择ObjectMapper有以下几个考量:
1.每一个model类需要写映射关系,
- ObjectMapper对错误类型进行了兼容,但ObjectMapper没有对返回值进行尝试转换,他返回了空(非nil)。
HandyJSON
class HandyModel: HandyJSON {
required init() {}
var name = ""
var age = ""
}
let handyModel = HandyModel.deserialize(from: jsonString)!
print("age:" + handyModel.age)
print(handyModel.name)
HandyJSON
对比其他框架,HandyJSON有便利性和错误类型处理上有更多的处理,最终选择HandyJSON作为新项目的JSON解析框架。