Swift:如何使用 Alamofilre 或 SwiftyJSON 将 JSON 字符串转换为 ObjectMapper?

Thu*_*ird 3 ios swift alamofire

我目前正在使用ObjectMapper for Swift 将 JSON 对象从 API 映射到模型对象

但我的restful api返回API看起来像这样:

{
       success: true,
       data: 
       [{  
          "stats":{  
             "numberOfYes":0,
             "numberOfNo":2,
             "progress":{  
                "done":false,
                "absolute":"2/100",
                "percent":2
             }
          },
          "quickStats":null,
          "uid":5,
          "name":"Flora",
          "imageArray":[  
             "http://s3.com/impr_5329beac79400000",
             "http://s3.com/impr_5329beac79400001"
          ],
          "metaData":{  
             "description":"Floral Midi Dress",
             "price":"40$"
          }
       }]

}
Run Code Online (Sandbox Code Playgroud)

在数据节点是数组中,我无法使用此代码查找映射

let json = JSON(responseObject!)

for tests in json["impressions"][0] {
  let test = Mapper<myTests>().map(tests)
  println(test?.impressionID)
}
Run Code Online (Sandbox Code Playgroud)

我应该如何修复?谢谢

**编辑** 我找到了类似@tristan_him 的解决方案

对象模型映射结构

class Response: Mappable {
    var success: Bool?
    var data: [Data]?

    required init?(_ map: Map) {
        mapping(map)
    }

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

class Data: Mappable {
    var uid: Int?
    var name: String?
    // add other field which you want to map        

    required init?(_ map: Map) {
        mapping(map)
    }

    func mapping(map: Map) {
        uid <- map["uid"]
        name <- map["name"]
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 Alamofire 响应进行映射

let response: Response = Mapper<Response>().map(responseObject)!

for item in response.data! {
    let dataModel: Data = item
    println(dataModel.name)
}
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以使用以下类结构映射上面的 JSON:

class Response: Mappable {
    var success: Bool?
    var data: [Data]?

    required init?(_ map: Map) {
        mapping(map)
    }

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

class Data: Mappable {
    var uid: Int?
    var name: String?
    // add other field which you want to map        

    required init?(_ map: Map) {
        mapping(map)
    }

    func mapping(map: Map) {
        uid <- map["uid"]
        name <- map["name"]
    }
}
Run Code Online (Sandbox Code Playgroud)

然后您可以按如下方式映射它:

let response = Mapper<Response>().map(responseObject)
if let id = response?.data?[0].uid {
    println(id)
}
Run Code Online (Sandbox Code Playgroud)