【问题标题】:AlamofireObjectMapper returning empty jsonarrayAlamofireObjectMapper 返回空的 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"]
    }

} 

【问题讨论】:

    标签: json swift alamofire objectmapper


    【解决方案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。

    【讨论】:

    • 也许我更新的答案可以帮助您更多地了解映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多