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

3

我目前在使用Swift的ObjectMapper将API返回的JSON对象映射到模型对象中。

但是我的RESTful 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$"
          }
       }]

}

在数据节点中,如果是数组,我无法使用这段代码查找映射。
let json = JSON(responseObject!)

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

我该怎么修复呢?谢谢。

** 编辑 ** 我发现了与@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"]
    }
}

通过Alamofire响应进行映射

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

for item in response.data! {
    let dataModel: Data = item
    println(dataModel.name)
}
1个回答

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"]
    }
}

然后,您可以按照以下方式进行映射:
let response = Mapper<Response>().map(responseObject)
if let id = response?.data?[0].uid {
    println(id)
}

@tristan_him,我们可以将'Response'和'Data'类放在两个不同的Response.swift和Data.swift文件中,还是需要将它们保留在单个.swift文件中? - Ashish P
@AshishPisey,它应该可以两种方式工作。这取决于您以及您想如何构建您的项目。 - tristan_him
这对于当前版本和Swift 3是一样的吗?抱歉,我对这个库非常陌生。 - Happiehappie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接