JSONParsing 0.2.1

JSONParsing 0.2.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2018年11月
SPM支持 SPM

Ravindra SoniKartik Khosla 维护。



 
依赖
SwiftyJSON~> 4.0
AnyErrorKit~> 0.1.1
 

  • 作者
  • Ravindra Soni

Fox Labs

Fox Labs | JSONParsing

CocoaPods Carthage Website: https://nickelfox.com

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

手动安装

如果您不想在项目中使用任何依赖管理器,您也可以手动安装此库。只需下载并将 文件夹添加到您的项目。