在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ Apple 在 Swift 的 Foundation 的模块中添加了对 JSON 解析成Model的原生支持。 虽然之前也有ObjectMapper和SwiftyJSON这样的解决方案,但是Swift 中添加了原生支持还是不免让人兴奋,使用起来也相对方便了许多。 简单使用如果你的 JSON 数据结构和你使用的 Model 对象结构一致的话,那么解析过程将会非常简单。只需要让Model声明 JSON数据: 1 { 2 "userInfos": [ 3 { 4 "userName": "小名", 5 "age": 18, 6 "height": 178.56, 7 "sex": true 8 }, 9 { 10 "userName": "小方", 11 "age": 18, 12 "height": 162.56, 13 "sex": false 14 } 15 ] 16 } Model对象: 1 struct UserList: Codable { 2 3 let userInfos: [UserInfo] 4 5 struct UserInfo: Codable { 6 7 let userName: String 8 let age: Int 9 let height: Float 10 let sex: Bool 11 } 12 } JSON转Model: 1 let jsonDecoder = JSONDecoder() 2 let modelObject = try? jsonDecoder.decode(UserList.self, from: jsonData) Model转JSON: 1 let jsonEncoder = JSONEncoder() 2 let jsonData = try? jsonEncoder.encode(modelObject) 关于 1 /// A type that can convert itself into and out of an external representation. 2 public typealias Codable = Decodable & Encodable
需要注意的是,使用时必须保证 JSON 数据结构和你使用的 Model 对象结构一致,任何不一致都会导致解析失败。 但是实际开发过程中,往往不会总是这样满足我们的需要,有时也需要我们对解析过程做一些改变。 自定义键值名为了保持风格一致,我们有时候不得不改变key成为我们需要的key值。 仍然使用上面的例子,现在我们把Model中的key 1 struct UserList: Codable { 2 3 let userInfos: [UserInfo] 4 5 struct UserInfo: Codable { 6 7 let userName: String 8 let age: Int 9 let bodyHeight: Float 10 let sex: Bool 11 12 private enum CodingKeys: String, CodingKey { 13 case userName 14 case age 15 case bodyHeight = "height" 16 case sex 17 } 18 } 19 } 格式处理
1 /// The strategy to use in decoding dates. Defaults to `.deferredToDate`. 2 open var dateDecodingStrategy: JSONDecoder.DateDecodingStrategy 3 4 /// The strategy to use in decoding binary data. Defaults to `.base64`. 5 open var dataDecodingStrategy: JSONDecoder.DataDecodingStrategy 6 7 /// The strategy to use in decoding non-conforming numbers. Defaults to `.throw`. 8 open var nonConformingFloatDecodingStrategy: JSONDecoder.NonConformingFloatDecodingStrategy
{"userInfos":[{"age":18,"sex":true,"height":178.55999755859375,"userName":"小名"},{"age":18,"sex":false,"height":162.55999755859375,"userName":"小方"}]} 如果想要提高阅读体验, 可以设置属性 1 open var outputFormatting: JSONEncoder.OutputFormatting 2 3 let jsonEncoder = JSONEncoder() 4 jsonEncoder.outputFormatting = .prettyPrinted 然后生成的JSON格式就会变成这样 1 { 2 "userInfos" : [ 3 { 4 "age" : 18, 5 "sex" : true, 6 "height" : 178.55999755859375, 7 "userName" : "小名" 8 }, 9 { 10 "age" : 18, 11 "sex" : false, 12 "height" : 162.55999755859375, 13 "userName" : "小方" 14 } 15 ] 16 } JSON中 没有 Model 所需要的 Key如果JSON的数据结构中,有些 Key - Value 不一定出现,Model中对应的要实用可选类型 JSON数据: 1 { 2 "userInfos": [ 3 { 4 "userName": "小名", 5 "age": 18, 6 "sex": true 7 }, 8 { 9 "userName": "小方", 10 "age": 18, 11 "height": 162.56, 12 "sex": false 13 } 14 ] 15 } Model对象: 1 struct UserList: Codable { 2 3 let userInfos: [UserInfo] 4 5 struct UserInfo: Codable { 6 7 let userName: String 8 let age: Int 9 let height: Float? 10 let sex: Bool 11 } 12 }
|
请发表评论