网络结果解析库毛皮之谈

市面上解决数据解析这块非常多方案

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了

屏幕快照 2018-01-23 下午3.30.22.png

至少提升开发效率几倍吧!
然后特么发现真的是落后了,居然又发现一个更牛逼哄哄的解析器

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 快速转化模型

你可能感兴趣的:(网络结果解析库毛皮之谈)