私は次のような応答モデルを持っています:
class ResponseModel: Mappable {
var data: T?
var code: Int = 0
required init?(map: Map) {}
func mapping(map: Map) {
data <- map["data"]
code <- map["code"]
}
}
Json-dataが配列でない場合は、次のように機能します。
{"code":0,"data":{"id":"2","name":"XXX"}}
しかし、それが配列の場合、それは機能しません
{"code":0,"data":[{"id":"2","name":"XXX"},{"id":"3","name":"YYY"}]}
私のマッピングコード;
let apiResponse = Mapper<ResponseModel>().map(JSONObject: response.result.value)
詳細については;私はこの記事を使用してこのコードを試しました: http://oramind.com/rest-client-in-Swift-with-promises/
データの宣言を配列に変更する必要があります。これがJSONでの方法だからです。
var data: [T]?
mapArray
の代わりにmap
メソッドを使用する必要があります。
let apiResponse = Mapper<ResponseModel>().mapArray(JSONObject: response.result.value)
私がしていることは次のようなものです:
func mapping(map: Map) {
if let _ = try? map.value("data") as [Data] {
dataArray <- map["data"]
} else {
data <- map["data"]
}
code <- map["code"]
}
どこ:
var data: T?
var dataArray: [T]?
var code: Int = 0
これに伴う問題は、data
とdataArray
の両方でnil値をチェックする必要があることです。
let apiResponse = Mapper<ResponseModel>().mapArray(JSONObject: response.result.value)
私のために働く
アブラハンファーの答えに基づいています。私は自分の解決策を共有します。 AlamofireのBaseResultを作成しました。
class BaseResult<T: Mappable> : Mappable {
var Result : Bool = false
var Error : ErrorResult?
var Index : Int = 0
var Size : Int = 0
var Count : Int = 0
var Data : T?
var DataArray: [T]?
required init?(map: Map){
}
func mapping(map: Map) {
Result <- map["Result"]
Error <- map["Error"]
Index <- map["Index"]
Size <- map["Size"]
Count <- map["Count"]
if let _ = try? map.value("Data") as [T] {
DataArray <- map["Data"]
} else {
Data <- map["Data"]
}
}}
Alamofireの使用法:
WebService.shared.request(url, params, encoding: URLEncoding.default, success: { (response : BaseResult<TypeData>) in
if let arr = response.DataArray
{
for year in arr
{
self.years.append(year)
}
}
}, failure: {
})
リクエスト方法は次のとおりです。
func request<T: Mappable>(_ url: String,_ parameters: [String : Any] = [:], _ method: HTTPMethod = .post,_ httpHeaders: HTTPHeaders? = nil, encoding: ParameterEncoding = JSONEncoding.default, success: @escaping (T) -> Void, failure: @escaping () -> () ) {
AF.request(newUrl, method:method, parameters:parameters, encoding:encoding, headers: httpHeaders)
.responseJSON { response in
if let res = response.value {
let json = res as! [String: Any]
if let object = Mapper<T>().map(JSON: json) {
success(object)
return
}
}else if let _ = response.error {
failure()
}
}
}
そしてTypeDataクラスは:
class TypeData : Mappable
{
var Id : String = ""
var Title: String = ""
required init(map: Map){
}
func mapping(map: Map) {
Id <- map["ID"]
Title <- map["YEAR"]
}}
SwiftyJSONを使用している人で、たとえば、親クラスを持たずにJSONから直接オブジェクトが必要な場合は、そのオブジェクトからの「データ」が必要です。あなたはこのようなことをすることができます、
if let data = response.result.value {
let json = JSON(data)
let dataResponse = json["data"].object
let responseObject = Mapper<DataClassName>().mapArray(JSONObject: dataResponse)
}
これにより、応答として[DataClassName]?
が返されます。