DeSerializer
轻量级的自动 JSON 映射框架。
描述
自动 JSON 反序列化的框架。围绕 KlappaDeSerializer 包裹,具有更多 Swift 语法和更好的 Swift 功能支持。
安装
添加
pod ‘DeSerializer’
到您的 Podfile 中。
然后运行
pod install
pod update
就可以开始了。
使用方法
简单情况
库提供了一个名为KLPDeserializer的静态方法类,强烈推荐使用它。让我们考虑以下JSON对象
{
"name": "A green door",
"price": 12.50
}
根据它进行类声明
class SimpleObject: Ancestor {
var name: String!
var price: NSDecimalNumber!
override static func getRequiredFields() -> [Any]! {
return ["name"]
}
}
然后你可以使用以下方式反序列化它
let object: SimpleObject? = DeSerializer.deserialize(json: dict)
其中 'dict' 可以是字典或JSON字符串。
嵌套对象
反序列化器也允许你轻松地将嵌套对象的JSON对象进行反序列化。让我们考虑以下JSON对象
{
"Title": "potato jpg",
"Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai",
"Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
"FileSize": 22630,
"FileFormat": "jpeg",
"Height": "362",
"Width": "532",
"Thumbnail": {
"Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
"Height": "98",
"Width": "145"
}
}
根据它进行类声明
class Thumbnail: Ancestor {
var url: String!
var height: String!
var width: String!
}
class NestedObject: Ancestor {
var title: String!
var summary: String!
var url: String!
var clickUrl: String!
var refererUrl: String!
var fileSize: Int = 0
var fileFormat: String!
var height: String!
var width: String!
var thumbnail: Thumbnail?
}
可以按照与简单对象相同的方式进行反序列化
let object: NestedObject? = DeSerializer.deserialize(json: dict)
数组解析
反序列化器允许你以简单的方式反序列化具有数组字段的复杂对象。让我们看一下以下JSON
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
根据它进行类声明
class Address: Ancestor {
var streetAddress: String!
var city: String!
var state: String!
var postalCode: String!
}
class Phone: Ancestor {
var type: String!
var number: String!
}
class NestedObjectWithArray: Ancestor {
var firstName: String!
var lastName: String!
var age: Int = 0
var address: Address!
var phoneNumber: [Phone] = []
}
可以按照与之前的例子完全相同的方式进行反序列化
let object: NestedObjectWithArray? = DeSerializer.deserialize(json: dict)
有时你不希望是对象,而是对象的数组。反序列化器允许你这样做。让我们考虑以下JSON样本
[
{
"Title": "potato jpg",
"Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai",
"Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
"FileSize": 22630,
"FileFormat": "jpeg",
"Height": "362",
"Width": "532",
"Thumbnail": {
"Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
"Height": "98",
"Width": "145"
}
},
{
"Title": "potato jpg",
"Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai",
"Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
"FileSize": 22630,
"FileFormat": "jpeg",
"Height": "362",
"Width": "532",
"Thumbnail": {
"Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
"Height": "98",
"Width": "145"
}
}
]
根据类声明
class Thumbnail: Ancestor {
var url: String!
var height: String!
var width: String!
}
class NestedObject: Ancestor {
var title: String!
var summary: String!
var url: String!
var clickUrl: String!
var refererUrl: String!
var fileSize: Int = 0
var fileFormat: String!
var height: String!
var width: String!
var thumbnail: Thumbnail?
}
正如你可能已经猜到的,反序列化非常简单
let objects: [NestedObject]? = DeSerializer.deserialize(json: array)
自定义字段映射
命名策略
命名策略 - 这是一个确定类中字段名称如何翻译成JSON中名称的类。KlappaDeSerializer提供了两种开箱即用的策略:KLPDefaultNamingStrategy和KLPExplicitNamingStrategy。显式命名策略是将类中字段一对一翻译。例如,如果您有一个名为"awesome_field"的字段,它将翻译成JSON中的"awesme_field"字段。默认命名策略将camelCase翻译成snake_case,即如果您类中有字段"awesomeField",则库将会在JSON中查找名为"awesome_field"的字段。目前不支持动态替换全局策略,它计划在下一个版本中添加。
类局部字段映射
有时您想要为单个或两个字段设置自定义映射,而不是全局映射,就像命名策略一样。在KlappaInjector中,您有两种实现方式 - 通过实现函数
func getCustomFieldsMapping() -> [AnyHashable : Any]!
或通过实现函数
func getNamingStrategy() -> KLPNamingStrategy?
在getCustomFieldsMapping函数中,您定义了一个字段如何被翻译成另一个字段。假设您类中有一个名为"url"的字段,在JSON中对应于"super_puper_awesome_url"。在这种情况下,您可以按以下方式实现函数
func getCustomFieldsMapping() -> [AnyHashable : Any]! {
return ["url": "super_puper_awesome_url"];
}
然而,这将让您逐个翻译字段。如果您想要为类设置不同的命名策略(即,API中的一些实体由于某种原因具有不同的命名策略),则应实现getNamingStrategy。该函数应定义将类字段转换为特定类JSON字段的策略。
必备属性
在您的网络模型中,通常有一些字段对于应用程序运行是必要的,而且您不希望传递没有这些字段的实体。KlappaInjector允许您指定这样的必要字段。为此,您必须实现函数
func getRequiredFields() -> [Any]!
基本上,考虑一下,您模型类中有一个名为"id"的字段,并且您希望它始终存在。在这种情况下,您应该像以下方式实现这个函数
override static func getRequiredFields() -> [Any]! {
return ["name"]
}
因此,在这种情况下,如果KlappaInjector遇到没有"id"的字段JSON - 它将返回nil,即使其他字段都在这里。
警告和限制
请注意,所有要将JSON反序列化的类都必须符合KLPDeserializable协议。请不要通过对NSObject进行扩展来符合此协议,而是从祖先那里继承您的类。
贡献
所有贡献和反馈都非常欢迎。如果您有任何关于 DeSerializer 工作方式的问题或疑问,您总是可以在问题部分提问或作为拉取请求提供修复。