2016-12-25 6 views
0

スウィフト3(ObjectMapper)を使用して、指定されたJSON応答のplayers配列を "Player"というカットダウンクラスオブジェクトにマップしようとしています。それをマップするのが難しいと思っています。スウィフトObjectMapperは、より多くのコンテキストなしで曖昧な返信を維持します

// Sample JSON 
{ 
    "_meta": { 
     ... 
    }, 
    "fixtures": [{ 
     ... 
    }], 
    "players": [{ 
     "name": "Smith", 
     "id": "15475-9524", 
    }] 
} 

しかし、私はそれは難しい、それは常に、それはより多くのコンテキストを必要と文句を言いようが適切にマッピングさせる方法を理解してもらうために探しています。

私はJSONコンシューマに、プレイヤーのリストを取得して、Object Mapperを使用しているすべてのプレーヤーを配列にマッピングしたいと考えています。

は、私が使用している場合

var players : Array<Player> = Mapper<Player>().mapArray(JSONArray: res)

それは私がJSONを消費するAlamoFireを使用しています

class Player: NSObject, Mappable { 
    var name: String? 

    required init?(map: Map) { 
     super.init() 
    } 

    // Mappable 
    func mapping(map: Map) { 
     name <- map["name"] 
    } 
} 

を次のように

Type of expression is ambiguous without more context

私のクラスがある文句を言います。

Alamofire.request(url).responseJSON(completionHandler: { 
    response in 

    switch response.result { 

    case .success(let JSON): 

     guard let res = JSON as? [String:Any] else { 
      print ("Can't do this") 
      return 
     } 

     var players : Array<Player> = Mapper<Player>().mapArray(JSONArray: res) 

print (players) 

    break 

    case .failure(let error): 
     print("** Request failed with error: \(error) **") 
     break 
    } 

フェッチしたい配列でObjectMapperを使用する方法をよく理解できません。

これについての助けがあれば助かります。

答えて

1

JSONディクショナリをPlayerの配列と混同していると思います。

このお試しください:大丈夫

guard let res = JSON as? [String:Any] else { 
     print ("res:Can't do this") 
     return 
    } 

    guard let json_players = res["players"] as? [[String:Any]] else { 
     print ("json_players:Can't do this") 
     return 
    } 

    var players : Array<Player> = Mapper<Player>().mapArray(JSONArray: json_players) 
+0

を行います。私は以前ObjectMapperを使っていませんでした。私はいつも手作業で構文解析を行ってきたので、これをやりたいと思っていました。 – zardon

+1

これはうまくいきました。アンラップされていないオプションの値について不平を言っていましたが、それで 'let players:Array = Mapper ().mapArray(JSONArray:json_players)!'に変更されました! – zardon

関連する問題