4

SwifyJSON ライブラリを Gloss に置き換えています。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]' に変換することはできません

4

2 に答える 2

1

質問からのまったく同じ「最初」と「2番目」のエラーメッセージで、まったく同じ問題が発生しました。以下は、私がどのように解決したかの抜粋です。

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])
        ...
    ...
}

そして、これが私のステーションクラスのように見えるものです:

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)!
    }
}
于 2016-08-28T21:11:39.003 に答える
0

Alamofire + Gloss があなたのために働きます。

ドキュメント(具体的にはこちら)に従って、プロジェクトの1つでこれを行いました(気を散らすものを取り除くために簡略化されています):

//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;dr

Gloss のfromJSONArray[1] と Alamofire の.responseJSONシリアライザ [2] を組み合わせることが魔法です。

[1] によって支持されてinit?(json: JSON)おり、両方ともDecodableプロトコルに含まれています。

[2] Gloss-yJSONタイプのオブジェクト、別名[String : AnyObject]タイプを吐き出します。

お役に立てれば。:)

この新しいココアポッドもチェックしてください: Alamofire-Gloss

于 2016-07-14T03:58:32.563 に答える