2017-11-15 18 views
0

Swift 4로 애플리케이션을 개발 중입니다. Alamofire로 APIRest를 호출하고 JSON 응답을 Objectmapper와 매핑하고자합니다. 그럼, 날 다시 호출하는 JSON은 다음과 같다 :중첩 된 객체의 신속한 매핑 (Objectmapper)

enter image description here

APIRest에 대한 코드는 다음과 같습니다

func retrievePostListData() { 
     Alamofire 
      .request("http://www.speedrun.com/api/v1/games", method: .get) 
      .validate() 
      .responseArray(completionHandler: { (response: 
      DataResponse<[PostModelSpeedRunModel]>) in 
       switch response.result { 
       case .success(let posts): 

       self.remoteRequestHandler?.onPostsRetrievedData(posts) 
        case .failure(_): 
         self.remoteRequestHandler?.onError() 
       } 
      }) 
    } 

문제는 내가 각각의 값에 액세스하는 방법을 모르겠입니다 (func 매핑). 중첩 된 값이 있기 때문입니다. 그 외에도 일부는 객체이고 나머지는 배열입니다. 내 잘못된 코드는 다음과 같습니다.

import Foundation 
import ObjectMapper 

struct PostModelSpeedRunModel { 
    var id    = "" 
    var international = "" 
    var abbreviation = "" 
    var links   = [Links]??? // I need to get "rel" and "uri" of "runs" 
    var uri    = "" 
} 

extension PostModelSpeedRunModel: Mappable { 

    init?(map: Map) { 
    } 

    mutating func mapping(map: Map) { 
     id    <- map["data.id"] 
     international <- map["data.international"] 
     abbreviation <- map["data.abbreviation"] 
     link    <- map["data.Links"] 
     uri    <- map["data.logo"] 
    } 

} 

기능 매핑을 수행하는 것을 도와 줄 수 있습니까? 감사합니다

답변

0

나는 당신의 코드를 시도했기 때문에 전혀 가치가 없다고 가정합니다. 아무 것도 얻지 못했습니다. json의 data 배열의 내용 만 필요하면 ObjectMapper는 PostModelSpeedRunModels 배열을 가진 json이 필요합니다. 당신은 또한 pagination 노드에서 정보가 필요한 경우

Alamofire.request("http://www.speedrun.com/api/v1/games", method: .get) 
     .responseArray(keyPath: "data") { (response: DataResponse<[PostModelSpeedRunModel]>) in 
      ... 
    } 

것은, 당신이 datapagination 속성을 가진 새로운 객체를 생성해야합니다 : 따라서, 당신은 시작의 IT AlamofireObjectMapper 말할 keyPath를 추가 포인트를 필요 DataResponse에있는 새 루트 개체를 사용하여 responseArray(keyPath: ...)responseObject으로 간단히 변경하십시오.

그럼 당신은 단지 runs의 uri를 원한다고 생각합니다. 따라서 링크 배열 대신 모델을 저장하기위한 String을 사용하는 것이 좋습니다. 링크 배열이 정렬되지 않고 앞으로 순서가 바뀔 수 있다고 가정하면 (직접 액세스 할 수 없으면 map["links.1.uri"]과 같이 직접 액세스 할 수 있습니다) 모든 링크를 구문 분석하고 필터링해야합니다. 다음과 같이 수행 할 수 있습니다.

struct PostModelSpeedRunModel { 
    var id    = "" 
    var international = "" 
    var abbreviation = "" 
    var runsLink  = "" 
    var uri    = "" 
} 

extension PostModelSpeedRunModel: Mappable { 

    init?(map: Map) { 
    } 

    mutating func mapping(map: Map) { 
     id    <- map["id"] 
     international <- map["international"] 
     abbreviation <- map["abbreviation"] 
     uri    <- map["logo"] 

     var links: [Link]? 
     links <- map["links"] 

     if let uri = links?.first(where: {$0.rel == "runs"})?.uri { 
      runsLink = uri 
     } 
    } 
} 

struct Link { 
    var rel = "" 
    var uri = "" 
} 

extension Link: Mappable { 
    init?(map: Map) { 
    } 

    mutating func mapping(map: Map) { 
     rel <- map["rel"] 
     uri <- map["uri"] 
    } 
}