从JSON响应Alamofire创建字符串数组

时间:2018-08-22 21:01:52

标签: ios json swift alamofire objectmapper

我正在尝试根据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数组结束?

3 个答案:

答案 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序列化和反序列化。