EasyJSON
EasyJSON 是一个简单的 JSON 到对象映射器。
要求
- iOS 9.0+
- Xcode 8.0+
- Swift 3.0+
安装
Cocoapods
EasyJSON 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "EasyJSON"
Carthage
为了安装它,请简单地将以下行添加到您的Cartfile中:
github "MataDesigns/EasyJSON"
功能
✅ 允许自定义从JSON到和从JSON映射✅ 映射是EasyModel子类的属性✅ 允许自定义解析特定属性的处理程序✅ 映射子对象✅ snake_case🐍 和camelCase🐪 支持
用法
重要!!!目前只支持类(如果使用结构体,则不起作用)
简介
建立模型
只需要创建一个其子类是EasyModel的类。
import EasyJSON
class Person: EasyModel {
var id: Int!
var firstName: String?
var lastName: String?
}
填充模型
从JSON到模型。
- 创建一个空模型
- 调用fill(withJson:)
- 您的模型现在已填充了字典中的信息。
只要键与属性名称完全匹配。
如果您字典的键与属性名称不同,请转到键映射。
import EasyJSON
// Person Model
let json = ["id": 1, "firstName": "Jane", "lastName": "Doe"]
let person = Person()
person.fill(withDict: json)
print(person.id) // Prints 1
print(person.firstName) // Prints Jane
print(person.lastName) // Prints Doe
模型转JSON
import EasyJSON
let json = person.toJson()
print(json) // Prints ["id": 1, "firstName": "Jane", "lastName": "Doe"]
高级
键映射
您可以通过实现KeyMap协议来创建自定义键映射。
目前我们提供了两个键映射。
属性映射
那么,当您的JSON与属性名称不同时怎么办呢?
import EasyJSON
class Person: EasyModel {
override var _options_: EasyModelOptions {
var maps = [KeyMap]()
maps.append(PropertyMap(modelKey: "id", jsonKey: "personId"))
return EasyModelOptions(maps: maps)
}
var id: Int!
var firstName: String?
var lastName: String?
}
此时,您可以使用以下JSON来填充对象。
let json = ["personId": 1, "firstName": "Jane", "lastName": "Doe"]
let person = Person()
person.fill(withDict: json)
print(person.id) // Prints 1
print(person.firstName) // Prints Jane
print(person.lastName) // Prints Doe
隐藏属性映射
那么,当您有一个与JSON无关的属性时怎么办?
import EasyJSON
class Person: EasyModel {
override var _options_: EasyModelOptions {
var maps = [KeyMap]()
maps.append(HidePropertyMap(modelKey: "fullName"))
return EasyModelOptions(maps: maps)
}
var id: Int!
var firstName: String?
var lastName: String?
var fullName: String {
var name = ""
name = name + (firstName ?? "")
name = name + (lastName != nil ? " " + lastName! : "")
return name
}
}
那么就可以隐藏或toJson该属性
let json = ["personId": 1, "firstName": "Jane", "lastName": "Doe"]
let person = Person()
person.fill(withDict: json)
print(person.id) // Prints 1
print(person.firstName) // Prints Jane
print(person.lastName) // Prints Doe
print(person.fullName) // Prints Jane Doe
let jsonDict = person.toJson()
print(jsonDict["fullName"]) // Prints nothing fullName key doesn't exist.
转换器
您可以通过实现转换器协议来创建自定义转换器。
转换器可以应用于特定类型或特定键。
(键转换器键优先于类型转换器键)
目前我们提供了两个转换器。
日期转换器
字符串转日期
{
"id": 1,
"firstName": "Nicholas",
"lastName": "Mata",
"birthday": "02/18/1994",
"createdOn": "2017-01-28T10:00:48",
"updatedOn": "2017-01-28T10:00:48"
}
因此日期只是字符串,我们如何将其转换为日期类型,然后再将JSON中的字符串转换回日期类型呢?
import EasyJSON
class Person: EasyModel {
override var _options_: EasyModelOptions {
var converters = [ConverterKey:Converter]()
converters[.key("birthDate")] = DateConverter(format: "MM/dd/yy")
converters[.type(Date.self)] = DateConverter(format: "yyyy-MM-dd'T'HH:mm:ss")
return EasyModelOptions(converters: converters)
}
var id: Int!
var firstName: String?
var lastName: String?
var birthday: Date?
var createdOn: Date?
var updatedOn: Date?
}
就是这样,然后你可以像使用任何其他日期类型一样使用它。
布尔转换器
字符串转布尔
{
"id": 1,
"firstName": "Nicholas",
"lastName": "Mata",
"isBestFriend" : "No"
}
那么,我们如何将一个字符串转换为布尔值呢?
import EasyJSON
class Person: EasyModel {
override var _options_: EasyModelOptions {
var converters = [ConverterKey:Converter]()
converters[.key("isBestFriend")] = BoolConverter(trueWhen: "Yes", whenFalse: "No", caseSensitive: false)
return EasyModelOptions(converters: converters)
}
var id: Int!
var firstName: String?
var lastName: String?
var isBestFriend: Bool = false
}
映射子对象
现在假设你有这样一些内容。
class Student: EasyModel {
var id: Int!
var firstName: String?
var lastName: String?
}
class Classroom: EasyModel {
var id: Int!
var name: String?
var students: [Student]?
}
你的JSON看起来像这样
{
"id": 1,
"name": "Computer Science",
"students": [{
"id": 1,
"firstName": "Nicholas",
"lastName": "Mata"
},
{
"id":2,
"firstName": "Jane",
"lastName": "Doe"
}]
}
它仅仅是这样工作的。
作者
尼古拉斯·马塔,[email protected]
授权协议
EasyJSON 在 MIT 授权协议下可用。更多信息请参阅 LICENSE 文件。