如何使用 objectmapper 进行数组映射?
How can I do array mapping with objectmapper?
我有一个如下所示的响应模型:
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)
任何使用 SwiftyJSON 的人,如果您想要直接来自 JSON 的对象而不需要父对象 class,例如,您想要来自它的 "data"。你可以这样做,
if let data = response.result.value {
let json = JSON(data)
let dataResponse = json["data"].object
let responseObject = Mapper<DataClassName>().mapArray(JSONObject: dataResponse)
}
这将 return 你 [DataClassName]?
作为回应。
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 值。
基于 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 是:
class TypeData : Mappable
{
var Id : String = ""
var Title: String = ""
required init(map: Map){
}
func mapping(map: Map) {
Id <- map["ID"]
Title <- map["YEAR"]
}}
我有一个如下所示的响应模型:
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)
任何使用 SwiftyJSON 的人,如果您想要直接来自 JSON 的对象而不需要父对象 class,例如,您想要来自它的 "data"。你可以这样做,
if let data = response.result.value {
let json = JSON(data)
let dataResponse = json["data"].object
let responseObject = Mapper<DataClassName>().mapArray(JSONObject: dataResponse)
}
这将 return 你 [DataClassName]?
作为回应。
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 值。
基于 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 是:
class TypeData : Mappable
{
var Id : String = ""
var Title: String = ""
required init(map: Map){
}
func mapping(map: Map) {
Id <- map["ID"]
Title <- map["YEAR"]
}}