我正在尝试根据JSON响应创建一些数组。我正在使用Alamofire对象映射器。我不确定我是否正确映射了对象。
这是我的JSON响应
{
"status": "success",
"data": [
{
"id": 1,
"name": "EXERCISE",
"parent_id": null,
"children": [
{
"id": 2,
"name": "All Exercises",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 3,
"name": "Warmup",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 4,
"name": "Pliés",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 5,
"name": "Tendus (Slow)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 6,
"name": "Tendus (Fast)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 7,
"name": "Dégagés (Slow)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 8,
"name": "Dégagés (Fast)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 9,
"name": "Petits Battements",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 10,
"name": "Ronds de Jambe",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 11,
"name": "Adage",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 12,
"name": "Frappés",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 13,
"name": "Fondus",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 14,
"name": "Grands Battements",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 15,
"name": "Rises",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 16,
"name": "Stretch",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 17,
"name": "Tendus (Centre)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 18,
"name": "Adage/PDB (Centre)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 19,
"name": "Relevés",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 20,
"name": "Pirouettes",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 21,
"name": "Petit Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 22,
"name": "Medium Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 23,
"name": "Grand Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 24,
"name": "Men’s Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 25,
"name": "Traveling Centre (Odd Bits)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 26,
"name": "Coda",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 27,
"name": "Révérence/Cool Down",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
}
],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 28,
"name": "LENGTH",
"parent_id": null,
"children": [
{
"id": 29,
"name": "All Lengths",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 30,
"name": "Short (__x4)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 31,
"name": "Medium (__x8)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 32,
"name": "Long (__x16)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 33,
"name": "Marathon (__x32)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 34,
"name": "Other",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
}
],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
}
]
}
这是我的Model类的片段
var Lid: Int?
var Fid: Int?
var Lname: String!
var Fname: String!
public override func mapping(map: Map) {
super.mapping(map: map)
Lid <- map["data.id"]
Lname <- map["data.name"]
Fid <- map["data.children.id"]
Fname <- map["data.children.name"]
}
当我调试时-我的模型类的属性为nil。我怎么能接受这个响应并以Lid和Lname数组结束?
答案 0 :(得分:0)
您可以做这样的事情
struct Exercise: Mappable {
var id: Int?
var name: String?
var parent_id: Int?
var childrens: [Exercise]?
init?(map: Map) {}
mutating func mapping(map: Map) {
id <- map["id"]
name <- map["name"]
parent_id <- map["parent_id"]
childrens <- map["children"]
}
}
并像这样映射它们
func mapData(data: [String: Any]) {
//the data here is the JSON of yours
guard let exerciseArray = data["data"] as? [[String: Any]] else { return }
//now we should be able to map array
let mappedExercises = Mapper<Exercise>().mapArray(JSONArray: exerciseArray)
}
现在,在新版本的swift中,您可以使用Codable
协议来处理模型的编码和解码。
答案 1 :(得分:0)
在Swift 4中,任何第三方对象映射器都已过时,因为内置的(De)Codable
协议功能更强大。
JSON包含一个根对象和一个嵌套的具有相同数据结构的对象树。
这是带有Decodable
的独立版本,甚至可以将日期解码为Date
实例
let jsonString = """
{
"status": "success",
"data": [
{
"id": 1,
"name": "EXERCISE",
"parent_id": null,
"children": [
{
"id": 2,
"name": "All Exercises",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 3,
"name": "Warmup",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 4,
"name": "Pliés",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 5,
"name": "Tendus (Slow)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 6,
"name": "Tendus (Fast)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 7,
"name": "Dégagés (Slow)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 8,
"name": "Dégagés (Fast)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 9,
"name": "Petits Battements",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 10,
"name": "Ronds de Jambe",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 11,
"name": "Adage",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 12,
"name": "Frappés",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 13,
"name": "Fondus",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 14,
"name": "Grands Battements",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 15,
"name": "Rises",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 16,
"name": "Stretch",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 17,
"name": "Tendus (Centre)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 18,
"name": "Adage/PDB (Centre)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 19,
"name": "Relevés",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 20,
"name": "Pirouettes",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 21,
"name": "Petit Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 22,
"name": "Medium Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 23,
"name": "Grand Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 24,
"name": "Men’s Allegro",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 25,
"name": "Traveling Centre (Odd Bits)",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 26,
"name": "Coda",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 27,
"name": "Révérence/Cool Down",
"parent_id": 1,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
}
],
"created_at": "2018-08-22 09:03:47",
"updated_at": "2018-08-22 09:03:47"
},
{
"id": 28,
"name": "LENGTH",
"parent_id": null,
"children": [
{
"id": 29,
"name": "All Lengths",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 30,
"name": "Short (__x4)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 31,
"name": "Medium (__x8)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 32,
"name": "Long (__x16)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 33,
"name": "Marathon (__x32)",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
},
{
"id": 34,
"name": "Other",
"parent_id": 28,
"children": [],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
}
],
"created_at": "2018-08-22 09:03:48",
"updated_at": "2018-08-22 09:03:48"
}
]
}
"""
struct Root : Decodable {
let status : String
let data : [Item]
}
struct Item : Decodable {
let name : String
let id : Int
let parentId : Int?
let children : [Item]
let createdAt, updatedAt : Date
}
do {
let data = Data(jsonString.utf8)
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
decoder.dateDecodingStrategy = .formatted(dateFormatter)
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result = try decoder.decode(Root.self, from: data)
print(result)
} catch { print(error) }
答案 2 :(得分:0)
https://github.com/schrockblock/eson
您可以尝试使用Eson库,该库将直接将json转换为Array of Model类。它迅速进行Json序列化和反序列化。