我的响应模型如下所示:
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/
答案 0 :(得分:11)
您需要使用mapArray
方法而不是map
:
let apiResponse = Mapper<ResponseModel>().mapArray(JSONObject: response.result.value)
答案 1 :(得分:1)
您需要将数据声明更改为数组,因为它是JSON中的数据:
var data: [T]?
答案 2 :(得分:1)
我所做的就是这样:
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值。
答案 3 :(得分:0)
任何使用SwiftyJSON的人如果你想直接使用JSON中的对象而没有父类,那么你需要&#34;数据&#34;从中。你可以这样做,
if let data = response.result.value {
let json = JSON(data)
let dataResponse = json["data"].object
let responseObject = Mapper<DataClassName>().mapArray(JSONObject: dataResponse)
}
这会将[DataClassName]?
作为回复返回给您。
答案 4 :(得分:0)
let apiResponse = Mapper<ResponseModel>().mapArray(JSONObject: response.result.value)
为我工作
答案 5 :(得分:0)
基于Abrahanfer的回答。我分享我的解决方案。我为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"]
}}