我使用库ObjectMapper将json映射到我的对象,但是我有一些问题要映射根json数组。
这是收到的json:
[
{
CustomerId = "A000015",
...
},
{
CustomerId = "A000016",
...
},
{
CustomerId = "A000017",
...
}
]
这是我的对象
class Customer : Mappable
{
var CustomerId : String? = nil
class func newInstance(map: Map) -> Mappable? {
return Customer()
}
func mapping(map: Map) {
CustomerId <- map["CustomerId"]
}
}
我用控制器
映射控制器中的jsonlet json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as! NSArray
if (error != nil) {
return completionHandler(nil, error)
} else {
var customers = Mapper<Customer>().map(json)
}
但它不起作用,我试过Mapper<[Customer]>().map(json)
但它也不起作用。
最后,我尝试创建一个包含Customer数组的新swift对象CustomerList,但它不起作用。
您是否知道如何映射根数组的json?
感谢。
答案 0 :(得分:55)
我终于解决了我的问题:
控制器中的映射方法应为
let json : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error)
if (error != nil) {
return completionHandler(nil, error)
} else {
var customer = Mapper<Customer>().mapArray(json)! //Swift 2
var customer = Mapper<Customer>().mapArray(JSONArray: json)! //Swift 3
}
如果它可以帮助某人。
答案 1 :(得分:9)
JSONObjectWithData(::)
与正确的条件向下转换类型您的JSON类型为[[String: AnyObject]]
。因此,使用Swift 2,您可以JSONObjectWithData(::)
使用[[String: AnyObject]]
类型的条件向下转换,以防止使用NSArray
或AnyObject!
:
do {
if let jsonArray = try NSJSONSerialization
.JSONObjectWithData(data, options: []) as? [[String: AnyObject]] {
/* perform your ObjectMapper's mapping operation here */
} else {
/* ... */
}
}
catch let error as NSError {
print(error)
}
Customer
方法mapArray(:)
ObjectMapper
的{{1}}类提供了一个名为Mapper
的方法,该方法具有以下声明:
mapArray(:)
public func mapArray(JSONArray: [[String : AnyObject]]) -> [N]?
文档说明了它:
将JSON字典数组映射到Mappable对象数组
因此,您的最终代码应如下所示:
ObjectMapper
do {
if let jsonArray = try NSJSONSerialization
.JSONObjectWithData(data, options: []) as? [[String: AnyObject]] {
let customerArray = Mapper<Customer>().mapArray(jsonArray)
print(customerArray) // customerArray is of type [Customer]?
} else {
/* ... */
}
}
catch let error as NSError {
print(error)
}
方法Customer
map(:)
的{{1}}类提供了一个名为ObjectMapper
的方法,该方法具有以下声明:
Mapper
map(:)
文档说明了它:
将JSON字典映射到符合Mappable
的对象
作为上一代码的替代方法,以下代码显示了如何使用func map(JSONDictionary: [String : AnyObject]) -> N?
将JSON映射到ObjectMapper
:
Customer
答案 2 :(得分:3)
最简单的解决方案由AlamofireObjectMapper提供。使用responseArray()
便捷方法:
Alamofire.request(endpoint).responseArray { (response: DataResponse<[MyMappableClass]>) in
if let result = response.result.value {
// Customer array is here
} else if let error = response.result.error {
// Handle error
} else {
// Handle some other not networking error
}
}
答案 3 :(得分:1)
解决使用通用对象映射根数组的问题的一种好方法是创建一个通用对象,该对象使用类实现中的对象创建列表。让我们看一下下面这种实现的一个例子:
Alamofire.request(REQ_URL_STRING,
method: REQ_METHOD(eg.: .GET),
parameters: REQ_PARAMS,
encoding: REQ_ENCODING,
headers: REQ_HEADERS).responseObject { (response: DataResponse<GenericResponseList<SingleElement>>) in
//your code after serialization here
}
在上面的代码中,您将使用您自己的值填充大写变量。检查闭包中的响应返回是来自Alamofire的通用对象DataResponse,我确实创建了另一个名为GenericResponseList的对象。我把内心放在&#34;&lt; &GT;&#34;我将从服务器获取列表的对象类型。在我的例子中,它是SingleElements列表。
现在,看一下下面GenericResponseList的实现:
final class GenericResponseList<T: Mappable>: Mappable {
var result: [T]?
required convenience init?(map: Map) {
self.init()
}
func mapping(map: Map) {
result <- map["result"]
}
}
看一下,我在类中有一个变量,它是我发送给这个类的泛型类型的列表。
var result: [T]?
所以现在,当你得到JSON时,它会将它转换为SingleElement列表。
希望它有所帮助:)
答案 4 :(得分:1)
在我最近的Swift 3中的相同情况下,能够解决以对象的形式获取对象映射器。
首先将json字符串转换为Object使用序列化。
let parsedMapperString = Mapper<Customer>.parseJSONString(JSONString: result) //result is string from json serializer
然后,您可以将Customer DTO从JSON字典的MapSet中获取到Mappable对象数组。
let customerDto = Mapper<Customer>().mapSet(JSONArray: jsonParsed as! [[String : Any]])
希望它有所帮助。感谢@Nicolas推动我接近解决方案。
答案 5 :(得分:1)
将数组转换为json并返回:
let json = shops.toJSONString()
let shops = Array<Shop>(JSONString: json)