2017-06-15 44 views
0

我想使用URL斯威夫特 - 如何使用ObjectMapper阅读Flickr的JSON

https://api.flickr.com/services/feeds/photos_public.gne?nojsoncallback=1&format=json

我试图用Alamofire消耗JSON消耗从来自Flickr的公开可用的饲料JSON然后使用ObjectMapper将JSON映射到基本的照片数据模型。

我遇到的问题是,我无法得到它的解析JSON,然后映射。

objects = Mapper<Photo>().mapArray(JSONArray: json)!

返回:

Cannot convert value of type 'JSON' to expected argument type '[[String : Any]]'

我的代码如下:

FlickrAPI.executeRequestURL(url, parameters: parameters) { (success, error, response) in 
      if (success) { 
       //print ("Response: \(response)") 

       if let jsonObject = response?.result.value { 
        let json = JSON(jsonObject) 

        objects = Mapper<Photo>().mapArray(JSONArray: json)! 

       } 

      } 
      else { 
       print ("** Error -- \(error?.localizedDescription) **") 
       taskCallback(false, error) 
      } 
     } 
// Execute URL request code: 
static func executeRequestURL(_ requestURL: URL, parameters:[String: String], taskCallback: @escaping (Bool, Error?, DataResponse<Any>?) ->()) 
    { 
     print ("Attempting URL -- \(requestURL)") 

     Alamofire.request(requestURL, parameters:["nojsoncallback": "1", "format": "json"]) 
      .validate(statusCode: 200..<300) 
      .validate(contentType: ["application/json"]) 
      .responseJSON { response in 

       switch(response.result) { 
       case .success(_): 
        taskCallback(true, nil, response) 
        break 

       case .failure(_): 
        print("Error while fetching url: \(response.result.error)") 
        taskCallback(false, response.result.error, nil) 
        break 
       } 
     } 
    } 

// Photo model 

final class Photo: Object, Mappable { 
    private(set) dynamic var uuid: String = UUID().uuidString 

    dynamic var name: String = "" 
    dynamic var author_id: String = "" 
    dynamic var title: String = "" 

override public static func primaryKey() -> String? { 
     return "uuid" 
    } 

    required convenience public init?(map: Map) { 
     self.init() 
    } 

    // MARK: - ObjectMapper protocol methods 

    public func mapping(map: Map) { 
     self.name <- map["name"] 
     self.author_id <- map["author_id"] 
     self.title <- map["title"] 
    } 

在审查照片公共URL我注意到响应在一个阵列整理在一起摄物体称为"items":

我读,我可以使用AlamofireObjectMapper帮助;但我对如何实际使用它感到困惑。

反正我的查询是具体我怎么消耗Flickr的公开照片内的items阵列使用ObjectMapper饲料?

非常感谢

回答

0

我能解决这个使用AlamofireObjectMapper

首先,创建一个类来抱回来的响应。其次确保这个类符合映射;

// Required to help integrate Alamofire with Objectmapper (via AlamofireObjectMapper) 
final class PhotoResponse: Mappable { 

    var items: [Photo]? 

    required init?(map: Map){ 

    } 

    func mapping(map: Map) { 
     items <- map["items"] 
    } 
} 

然后,当我调用执行URL时,我稍微改变它,以便它符合这个类;

static func executeRequestURL(_ requestURL: URL, parameters:[String: String], taskCallback: @escaping (Bool, Error?, DataResponse<PhotoResponse>?) ->()) 
    { 
     print ("Attempting URL -- \(requestURL)\n") 

     Alamofire.request(requestURL, parameters:["nojsoncallback": "1", "format": "json"]) 
      .validate(statusCode: 200..<300) 
      .validate(contentType: ["application/json"]) 
      .responseObject { (response: DataResponse<PhotoResponse>) in 

       switch(response.result) { 
       case .success(_): 
        taskCallback(true, nil, response) 
        break 

       case .failure(_): 
        print("** Error while fetching url: \(response.result.error) **") 
        taskCallback(false, response.result.error, nil) 
        break 
       } 
     } 
    } 

这里的关键部分是response: DataResponse<PhotoResponse>) in行。

最后,当我们通过我fetchPublicPhotos函数中调用它,我可以查询结果回来

let photoResponse = response?.result.value 

if let items = photoResponse?.items { 
    print ("Items found: #\(items.count)") 
    // do something with items here 
}