AlamofireObjectMapper 返回空的 jsonarray

Posted

技术标签:

【中文标题】AlamofireObjectMapper 返回空的 jsonarray【英文标题】:AlamofireObjectMapper returning empty jsonarray 【发布时间】:2016-06-30 18:47:49 【问题描述】:

我的问题是:为什么我的方法返回一个带有 .responseArray 的空 json 数组?

我的 REST-API 有以下 JSON:

[
   
       "id": 1,
       "title": "Crazy",
       "startDate": "2016-07-16 22:00:00.0",
       "endDate": "2016-07-17 03:00:00.0",
       "location": "Crazy",
       "description": "Crazy",
       "avatar": "base64"
    , 
    
        "id": 2,
        "title": "Crazy title",
        "startDate": "2016-07-16 22:00:00.0",
        "endDate": "2016-07-17 03:00:00.0",
        "location": "Crazy",
        "description": "Something",
        "avatar": "base64"
    ,
    
        "id": 3,
        "title": "Crazy",
        "startDate": "2016-07-16 22:00:00.0",
        "endDate": "2016-07-17 03:00:00.0",
        "location": "Crazy",
        "description": "Crazy",
        "avatar": "base64"
    , 
    
        "id": 4,
        "title": "Crazy",
        "startDate": "2016-07-16 22:00:00.0",
        "endDate": "2016-07-17 03:00:00.0",
        "location": "Crazy",
        "description": "Crazy",
        "avatar": "base64"
]

如您所见,json 是一个包含多个对象的数组。

我使用 AlamofireObjectMapper 将 json 映射为对象,但它返回给我一个空数组:

 func getEventFromApiWebService(completionHandler: (event: [Event]) -> ())
    Alamofire.request(ApiRouter.Get("/events"))
        .validate()
        .responseArray(completionHandler:  (response: Response<[Event], NSError>) in

            //Attempt to print result value which returns empty Array
            let eventArray = response.result.value
            print(eventArray!)

            completionHandler(event: response.result.value!)

        )

以下代码确实适用于 .responseJSON:

    func test()
    Alamofire.request(ApiRouter.Get("/events"))
        .responseJSON  response  in

            print(response.result.value!)
    

但是这里没有映射。

事件类:

import ObjectMapper
import RealmSwift

class Event: Object, Mappable 

    dynamic var id = 0
    dynamic var eventID = 0
    dynamic var title: String? = nil
    dynamic var startDate: NSDate? = nil
    dynamic var endDate: NSDate? = nil
    dynamic var location: String? = nil
    dynamic var desc: String? = nil
    dynamic var avatar: NSData? = nil

    override static func primaryKey() -> String? 
        return "id"
    

    required convenience init?(_ map: Map) 
        self.init()

        if map["id"].value() == nil 
            return nil
        
        if map["title"].value() == nil 
            title = ""
        
        if map["startDate"].value() == nil 
            startDate = nil
        
        if map["endDate"].value() == nil 
            endDate = nil
        
        if map["location"].value() == nil 
            location = ""
        
        if map["description"].value() == nil 
            desc = ""
        
        if map["avatar"].value() == nil 
            avatar = nil
        
    

    func mapping(map: Map) 
        self.eventID        <- map["id"]
        self.title          <- map["title"]
        self.startDate      <- map["startDate"]
        self.endDate        <- map["endDate"]
        self.location       <- map["location"]
        self.desc           <- map["description"]
        self.avatar         <- map["avatar"]
    

 

【问题讨论】:

【参考方案1】:

Alamofire 没有responseArray 方法。 https://github.com/Alamofire/Alamofire#response-serialization

使用responseJSON 获取 JSON 并转换为数组。

.responseJSON  response in

    guard response.result.isSuccess else
    
          //handle error 
          return
    

响应序列化

内置响应方法

响应() responseData() responseString(编码:NSStringEncoding) responseJSON(选项:NSJSONReadingOptions) responsePropertyList(options: NSPropertyListReadOptions)
required convenience init?(_ map: Map) 
    self.init()


func mapping(map: Map) 
    id    <- map["id"]
    title <- map["title"]
    startDate <- map["startDate"]
    endDate <- map["endDate"]

【讨论】:

我的错,我正在使用扩展库 github.com/tristanhimmelman/AlamofireObjectMapper 他们在代码 sn-ps 中使用的位置:Alamofire.request(.GET, URL).responseArray。我会在问题中编辑我的图书馆名称,对不起! 谢谢!我会继续寻找解决方案,因为它应该可以与 AlamofireObjectMapper 一起使用! 需要导入AlamofireObjectMapper吗? 是的,但我找到了解决方案!感谢您抽出宝贵时间回复! 如果我从 ARC 发出请求,它会在数据到来时从服务器返回空响应。【参考方案2】:

事实证明,我的事件类中的 DataTypes 不适合 JSON。 在required convenience init?(_ map: Map) 的某个地方,它给了我一个零,因此拒绝反序列化整个 JsonArray。

【讨论】:

也许我更新的答案可以帮助您更多地了解映射。

以上是关于AlamofireObjectMapper 返回空的 jsonarray的主要内容,如果未能解决你的问题,请参考以下文章

如何实例化映射类? (迅速 - alamofireObjectMapper)

ObjectMapper 无法序列化响应

如何在 AlamofireObjectMapper 中映射对象

在 AlamofireObjectMapper 响应中映射 allHeaderFields

AlamofireObjectmapper 编码模型属性

AlamofireObjectMapper / ObjectMapper 是不是支持结构类型映射