如何使用Gloss将Alamofire的响应转换为[JSON]?

时间:2016-04-10 09:09:10

标签: json swift gloss

我正在用Gloss替换SwifyJSON库。我将WS响应转换为JSON格式时遇到问题。 在SwiftyJSON中,我这样做了:

guard let data = response.result.value else  {
            ...
            return
        }

let jsonData = JSON(data)

我的回答如下:

[{
  "lat": "45.2",
  "lon": "-79.38333",
  "name": "Sample"
}, {
  "lat": "23.43",
  "lon": "45.3",
  "name": "Sample"
}]

我需要从这里创建一个JSON对象数组([JSON]),所以我可以在这个方法中使用:

let jsonArray = ?
guard let destinations = [Destination].fromJSONArray(jsonArray) else
{
    ...
    return
}

我试过了:

guard let data = response.result.value as? [(String,AnyObject)] else  {
            ...
            return
}

guard let data = response.result.value as? [Gloss.JSON] else  {
            ...
            return
}

第一个说:不能将'[(String,AnyObject)]'类型的值转换为预期的参数类型'[JSON]' 第二:条件绑定的初始化程序必须具有可选类型,而不是'[目标]'

2 个答案:

答案 0 :(得分:1)

我遇到与问题完全相同的“第一个”和“第二个”错误消息完全相同的问题。贝娄是我如何解决它的摘录:

import Gloss
import Alamofire

...

Alamofire.request(.GET, url, parameters: params).responseJSON {
    response in switch response.result {
    case .Success(let json):
        // Here, stations is already an array of Station class
        let stations = [Station].fromJSONArray(json as! [Gloss.JSON])
        ...
    ...
}

这就是我的Station类:

import Gloss

class Station: Decodable {
    var id: Int = 0
    var attribute1: Int = 0
    var attribute2: Int = 0

    init(id: Int, attribute1: Int, attribute2: Int) {
        super.init()
        self.id = id
        self.attribute1 = attribute1
        self.attribute2 = attribute2
    }

    required init?(json: JSON) {
        super.init()
        self.id = ("id" <~~ json)!
        self.attribute1 = ("attribute1" <~~ json)!
        self.attribute2 = ("attribute2" <~~ json)!
    }
}

答案 1 :(得分:0)

Alamofire + Gloss为您完成工作。

按照文档(特别是here),我在我的一个项目中做了这个(简化以消除干扰):

//iOS 9.3, Xcode 7.3

/// stripped-down version
struct Event: Decodable {
    var id: String?

    init?(json: JSON) {
    id = "id" <~~ json
    }
}

//...

func getEvents(completion: (AnyObject?) -> Void) {
    request(.GET, baseURL + endpointURL)
        .responseJSON { response in
            switch response.result {
            case .Failure(let error):
                print(error.localizedDescription)
            case .Success:
                guard let value = response.result.value as? JSON,
                let eventsArrayJSON = value["events"] as? [JSON] //Thus spake the particular API's docs
                else { fatalError() }
                let events = [Event].fromJSONArray(eventsArrayJSON)

                // do stuff with my new 'events' array of type [Events]
            }
        }
}

TL;博士

神奇的是将Gloss fromJSONArray [1]与Alamofire的.responseJSON序列化器[2]结合起来。

[1]由init?(json: JSON)协议支持Decodable

[2]吐出一个Gloss-y JSON - 类型的对象,又称[String : AnyObject] - 类型。

希望这会有所帮助。 :)

另请查看这个新的cocoapod:Alamofire-Gloss