Swift ObjectMapper:如何解析数组内部的数组

Swift ObjectMapper: How to parse array inside of an array

这是我的 JSON 回复:

[
    [
        {
            "id": 22,
            "request_id": "rqst5c12fc9e856ae1.06631647",
            "business_name": "Code Viable",
            "business_email": "code@viable.com",
            "title": "Apache Load/Ubuntu",
        }
    ],
    [
        {
            "id": 24,
            "request_id": "rqst5c130cae6f7609.41056231",
            "business_name": "Code Viable",
            "business_email": "code@viable.com",
            "title": "Load",
        }
    ]
]

这个JSON结构得到了一个数组内部的数组,内部数组的对象就是我要解析的。这是我的映射器:

struct JobResponseDataObject: Mappable {

    init?(map: Map) {

    }

    var id: Int?
    var requestId: String?
    var businessName: String?
    var businessEmail: String?

    mutating func mapping(map: Map) {

        id              <- map["id"]
        requestId       <- map["request_id"]
        businessName    <- map["business_name"]
        businessEmail   <- map["business_email"]

    }
}

我已经尝试创建另一个映射器 struct 来保存对象数组 [JobResponseDataObject] 并使用 Alamofire 的 responseArray 来处理它,但它没有用。我也尝试过在我的 json id 前加上 0. 前缀,但这也没有用。请帮助

感谢

您可以在此处使用 Codable 来映射 JSON 响应,JobResponseDataObject struct 应该如下所示,

struct JobResponseDataObject: Codable {
    var id: Int?
    var requestId: String?
    var businessName: String?
    var businessEmail: String?
    var title: String?

    private enum CodingKeys: String, CodingKey {
        case id = "id"
        case requestId = "request_id"
        case businessName = "business_name"
        case businessEmail = "business_email"
        case title = "title"
    }
}

let json = JSON(responseJSON: jsonData)
    do {
        if let value = try? json.rawData(){
            let response = try! JSONDecoder().decode([[JobResponseDataObject]].self, from: value)
        }

    } catch {
        print(error.localizedDescription)
}

所以这就是交易...Codable 是 Apple 的一个非常酷的协议,用于处理来自 API 的解析 JSON 响应。你得到的是一个数组数组,所以你的东西看起来像这样:

[[ResponseObject]]

所以不管怎样,你要创建你的对象的结构,像这样:

struct ResponseObject: Codable {
    let id: Int?
    let requestId: String?
    let businessName: String?
    let businessEmail: String?
    let title: String?
}

您会注意到我稍微更改了密钥名称(而不是 request_id,我使用 requestId)。原因是 JSONDecoder 有一个名为 keyDecodingStrategy 的 属性,它提供了一个可以从中 select 的固定解码策略的枚举。你会 convertFromSnakeCase.

您可以将这里的代码转储到操场上进行修改。基本上,声明你的结构,将它与你 JSON 中的任何键匹配,声明一个解码器,为它提供解码策略,然后解码它。

以下是调用 Alamofire 的方法:

    private let backgroundThread = DispatchQueue(label: "background",
                                                 qos: .userInitiated,
                                                 attributes: .concurrent,
                                                 autoreleaseFrequency: .inherit,
                                                 target: nil)


    Alamofire.request(url).responseJSON(queue: backgroundThread) { (response) in
        guard response.result.error == nil else {
            print("KABOOM!")
            return
        }

        if let data = response.data {
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase

            do {
                let parsedResponse = try decoder.decode([[ResponseObject]].self, from: data)
                print(parsedResponse)
            } catch {
                print(error.localizedDescription)
            }
        }
    }

这是您可以在操场上玩的代码。

import UIKit

let json = """
[
    [
        {
        "id": 22,
        "request_id": "rqst5c12fc9e856ae1.06631647",
        "business_name": "Code Viable",
        "business_email": "code@viable.com",
        "title": "Apache Load/Ubuntu",
        }
    ],
    [
        {
        "id": 24,
        "request_id": "rqst5c130cae6f7609.41056231",
        "business_name": "Code Viable",
        "business_email": "code@viable.com",
        "title": "Load",
        }
    ]
]
"""

struct ResponseObject: Codable {
    let id: Int?
    let requestId: String?
    let businessName: String?
    let businessEmail: String?
    let title: String?
}

if let data = json.data(using: .utf8) {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase

    do {
        let parsedResponse = try decoder.decode([[ResponseObject]].self, from: data)
        print(parsedResponse)
    } catch {
        print(error.localizedDescription)
    }
}

您应该将此 JobResponseDataObject 结构用作 [[JobResponseDataObject]] 而不是 [JobResponseDataObject] - 您在父结构或 [=15 中使用此结构制作 属性 =].