JSONParsing
是围绕 SwiftyJSON 的包装,以便以更易于理解的方式解析 JSON。
用法
让我们选择一个 JSON
示例
{
"name": "John",
"age": 27
}
要解析(或者说反序列化)此 JSON
,创建一个类
final public class User {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
并将此类确认到 JSONParseable
协议
extension User: JSONParseable {
public static func parse(_ json: JSON) throws -> User {
return try User(name: json["name"]^,
age: json["age"]^)
}
}
要将用户对象序列化(编码)为这个 JSON
extension User {
public var toJSON: [String: Any] {
["name": self.name,
"age": self.age]
}
运算符
^
自动推断和解析关联的非可选数据类型。^^
自动推断和解析任意类型的数组值。^?
推断和解析可选值^!
尝试强制将 JSON 值解析为相应数据类型。
高级示例
嵌套JSON
让我们看一个更复杂的JSON
的例子。
{
"name": "John",
"age": 27,
"address": {
"house_number": "B51",
"street": "Street 21",
"city": "Woodland",
"country": "Singapore"
}
}
为了解析这个JSON
,可以创建两个不同的类,例如:
final public class User {
var name: String
var age: Int
var address: Address
init(name: String, age: Int, address: Address) {
self.name = name
self.age = age
self.address = address
}
}
final public class Address {
var houseNumber: String
var street: String
var city: String
var country: String
init(houseNumber: String, street: String, city: String, country: String) {
self.houseNumber = houseNumber
self.street = street
self.city = city
self.country = country
}
}
并按照如下方式确认符合JSONParseable
协议:
extension User: JSONParseable {
public static func parse(_ json: JSON) throws -> User {
return try User(name: json["name"]^,
age: json["age"]^,
address: json["address"]^)
}
}
extension Address: JSONParseable {
public static func parse(_ json: JSON) throws -> Address {
return try User(houseNumber: json["house_number"]^,
street: json["street"]^,
city: json["city"]^,
country: json["country"]^)
}
}
嵌套数组的JSON
这是另一个更复杂的JSON
的例子。
{
"name": "John",
"age": 27,
"addresses": [
{
"house_number": "B51",
"street": "Street 21",
"city": "Woodland",
"country": "Singapore"
},
{
"house_number": "C42",
"street": "Street 21",
"city": "Woodland",
"country": "Singapore"
},
{
"house_number": "71",
"street": "Street 82",
"city": "Woodland",
"country": "Singapore"
}
]
}
为了解析这个JSON
,可以创建两个不同的类,例如:
final public class User {
var name: String
var age: Int
var address: [Address]
init(name: String, age: Int, address: Address) {
self.name = name
self.age = age
self.address = address
}
}
final public class Address {
var houseNumber: String
var street: String
var city: String
var country: String
init(houseNumber: String, street: String, city: String, country: String) {
self.houseNumber = houseNumber
self.street = street
self.city = city
self.country = country
}
}
并按照如下方式确认符合JSONParseable
协议:
extension User: JSONParseable {
public static func parse(_ json: JSON) throws -> User {
return try User(name: json["name"]^,
age: json["age"]^,
address: json["addresses"]^^)
}
}
extension Address: JSONParseable {
public static func parse(_ json: JSON) throws -> Address {
return try User(houseNumber: json["house_number"]^,
street: json["street"]^,
city: json["city"]^,
country: json["country"]^)
}
}
转换
JSONParsing
支持转换,允许你将任何值或对象作为原始JSON类型来处理。
它自带默认的String -> URL
转换,这允许你从描述URL的字符串中解析URL属性,而无需编写任何转换代码。
同样适用于String -> Int, Double, Float
转换。如果你正在解析数字类型,并且找到了字符串,该字符串将自动转换为该数字类型(如果可能)。
要使自己的类型可使用转换进行解析,只需确保你的类型符合JSONParseTransformable
并实现其协议方法即可。
以下是一个使Date
类型可解析的转换示例
要解析Date
,首先确认Date
符合JSONParseTransformable
extension Date: JSONParseTransformable {
public typealias RawValue = String
public static func transform(_ value: String) -> Date? {
let formatter = DateFormatter()
formatter.dateFormat = "d MMM, yyyy"
return formatter.date(from: value)
}
}
现在,让我们来看一个User
类的例子
final public class User {
var name: String
var age: Int
var dob: Date?
init(name: String, age: Int, dob: Date?) {
self.name = name
self.age = age
self.date = date
}
}
并将此类确认到 JSONParseable
协议
extension User: JSONParseable {
public static func parse(_ json: JSON) throws -> User {
return try User(name: json["name"]^,
age: json["age"]^),
date: Date.transform(json["dob"]^)
}
}
支持的类型
JSONParsing支持解析所有标准JSON
类型,如下所示:
- Bool
- Int, Double, Float
- String
- Array
- Dictionary
- URL
它还支持所有可能的嵌套数组和字典的组合,如上述示例所示。
最后,如果需要,它还支持通过使用转换器使用关联类型,只需像上述示例中解析Date
一样确认该类型符合JSONParseTransformable
即可。
安装
CocoaPods
CocoaPods 是 Cocoa 库的依赖管理器。您可以使用以下命令安装 Cocoapods
$ sudo gem install cocoapods
如果您想在项目中集成 JSONParsing
,那么请按照以下修改您的 Podfile
platform :ios, '9.0'
use_frameworks!
target 'YourAppName' do
pod 'JSONParsing'
end
保存 Podfile
后。运行以下命令
pod install
手动安装
如果您不想在项目中使用任何依赖管理器,您也可以手动安装此库。只需下载并将 源
文件夹添加到您的项目。