市面上解决数据解析这块非常多方案
json解析上oc中mjextension yymodel 什么的都不说了不是说那些不好runtime完美支持且必须继承nsobject对象才能成功反序列化key value 自动转化没什么说的必备
swift 上swiftyjson 和 objectmapper还是比较好用但是呵呵了某些字段写出来实在是要死的节奏一个body简单点的都是几十个字段,还分层,光是写这样的, 多不是问题,错误才是距离,太多你写就容易写错你死不死啊?
Class mydata{
self.p = json["sds"].string
self.pp = json["pp"].int
巴拉巴拉
}
不知哪天看到个这个结合swiftyjson特别方便,但是实际上你不转模型直接json格式到处跑是真的难以维护,自己写还好点,一旦需要人家阅读你的代码的时候,不被骂死??????所以还是需要转一下,JSONEXPORT GIThub上下载好安装完你再也不用自己写转换的model了
至少提升开发效率几倍吧!
然后特么发现真的是落后了,居然又发现一个更牛逼哄哄的解析器
HandyJSON
这个用起来还更方便
var int: Int = 2
var doubleOptional: Double?
var stringImplicitlyUnwrapped: String!
required init() {}
}
let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
if let object = BasicTypes.deserialize(from: jsonString) {
print(object.int)
print(object.doubleOptional!)
print(object.stringImplicitlyUnwrapped)
}
然后最新又出来个哎要不要我们活下去这么频繁不会死么
不用框架的话,什么不用了原生终于支持model json的解析了好吧不用那些pod和package,热烈欢迎.还能怎样只有用一波了,列子
struct Swifter: Decodable {
let fullName: String
let id: Int
let twitter: URL
}
//三个""" """ 你可以随便换行玩字符了也是新的特性
let json = """
{
"fullName": "Federico Zanetello",
"id": 123456,
"twitter": "http://twitter.com/zntfdr"
}
""".data(using: .utf8)!
let myStruct = try JSONDecoder().decode(Swifter.self, from: json) // Decoding our data
print(myStruct) // decoded!!!!!
那么哪些是可以这样做的呢,呵呵以上数据的类型都是实现了默认decodeble协议的,来变一变看到它的强大相信你会喜欢上他
enum BeerStyle : String, Codable {
case ipa
case stout
case kolsch
// ...
}
struct Beer {
let name: String
let brewery: String
let style: BeerStyle
}
let json = """
{
"name": "Endeavor",
"abv": 8.9,
"brewery": "Saint Arnold",
"style": "ipa"
}
""".data(using: .utf8)!
let myStruct = try JSONDecoder().decode(Swifter.self, from: json) // Decoding our data
print(myStruct) // decoded!!!!!
自定义对象的实现
struct Swifter {
let fullName: String
let id: Int
let twitter: URL
init(fullName: String, id: Int, twitter: URL) { // default struct initializer
self.fullName = fullName
self.id = id
self.twitter = twitter
}
}
extension Swifter: Decodable {
enum MyStructKeys: String, CodingKey { // declaring our keys
case fullName = "fullName"
case id = "id"
case twitter = "twitter"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: MyStructKeys.self) // defining our (keyed) container
let fullName: String = try container.decode(String.self, forKey: .fullName) // extracting the data
let id: Int = try container.decode(Int.self, forKey: .id) // extracting the data
let twitter: URL = try container.decode(URL.self, forKey: .twitter) // extracting the data
self.init(fullName: fullName, id: id, twitter: twitter) // initializing our struct
}
}
let json = """
{
"fullName": "Federico Zanetello",
"id": 123456,
"twitter": "http://twitter.com/zntfdr"
}
""".data(using: .utf8)! // our native (JSON) data
let myStruct = try JSONDecoder().decode(Swifter.self, from: json) // decoding our data
print(myStruct) // decoded!
一言不合就decode出正确结果
但是小心噢 这种方式遇到try的就是会有情况出现异常的哦 ,遇到的话自己就去处理吧.真实开发中所以我还是用handyjson或者swiftyjson因为服务器拿下来如果有错误的字段可以避免处理异常嘿嘿,毕竟有jsonexport这样好用的工具不写哈哈
然后告诉大家一个牛逼快速的工具swiftai 快速转化模型