Moya-JASON 1.1.0

Moya-JASON 1.1.0

测试已测试
语言语言 SwiftSwift
许可协议 MIT
发布上次发布2017年1月
SwiftSwift 版本3.0
SPM支持 SPM

Sunshinejr 维护。



JASONMoya 绑定,通过 RxSwiftReactiveCocoa 绑定,更方便地进行 JSON 序列化。

安装

使用

创建一个实现 Mappable 协议的模式结构体或类。

在映射时未处理错误的示例

import JASON
import Moya_JASON

private extension JSONKeys {
    static let id       = JSONKey<Int>("id")
    static let language = JSONKey<String>("language")
    static let url      = JSONKey<String?>("url")
}

struct Repository: Mappable {

    let identifier: Int
    let language: String
    let url: String?

    init(_ json: JSON) throws {
        identifier  = json[.id]
        language    = json[.language]
        url         = json[.url]
    }
}

处理映射错误的示例

import JASON
import Moya_JASON

public enum UserParsingError: Error {
    case login
}

private extension JSONKeys {
    static let login = JSONKey<String>("login")
}

struct User: Mappable {

    let login: String

    init(_ json: JSON) throws {
        login = json[.login]
        if login.isEmpty {
            throw UserParsingError.login
        }
    }
}

然后您可以使用扩展自 Moya 的响应的方法。这些方法包括

mapObject()
mapObject(withKeyPath:)
mapArray()
mapArray(withKeyPath:)

当使用 mapObject() 尝试将整个响应数据映射到对象时,使用 mapObject(withKeyPath:) 您可以指定响应中的嵌套对象进行获取。例如 mapObject(withKeyPath: "owner")RxSwiftReactiveCocoa 扩展也有这些方法。

1. 正常使用(不使用 RxSwift 或 ReactiveCocoa)

provider = MoyaProvider<GitHub>()
provider.request(GitHub.repos("mjacko")) { (result) in
    if case .success(let response) = result {
        do {
            let repos: [Repository] = try response.mapArray()
            print(repos)
        } catch {
            print("There was something wrong with the mapping!")
        }
    }
}

2. RxSwift

provider = RxMoyaProvider<GitHub>()
provider
    .request(GitHub.repo("Moya/Moya"))
    .mapObject(User.self, keyPath: "owner")
    .subscribe { event in
        switch event {
        case .next(let user):
            print(user)
        case .error(let error):
            print(error)
        default: break
        }
}

3. ReactiveCocoa

provider = ReactiveCocoaMoyaProvider<GitHub>()
provider
    .request(GitHub.repos("mjacko"))
    .mapArray(Repository.self)
    .observeOn(UIScheduler())
    .start { event in
        switch event {
        case .value(let repos):
            print(repos)
        case .failed(let error):
            print(error)
        default: break
        }
}

作者

Sunshinejr,[email protected]@thesunshinejr

许可协议

Moya-JASON 可在 MIT 许可证下获得。有关更多信息,请参阅 LICENSE 文件。