3

来自服务器的 JSON 如下所示:

值是另一个字典的字典。

{
    "S1": {
        "vpn_status": 2,
        "vpn_name": "vpn1"
    },
    "S2": {
        "vpn_status": 1,
        "vpn_name": "vpn2"
    }
}

我创建了以下结构来解析它。

public struct ServerStatusResult {

    public let vpnName: String
    public let status: Int

    init?(json: [String: Any]) {
        guard
            let vpnName = json["vpn_name"] as? String,
            let status = json["vpn_status"] as? Int
            else {
                return nil
        }
        self.vpnName = vpnName
        self.status = status
    }
}

调用服务器的函数是:

typealias serverStatusCompletedClosure = (_ status: Bool, _ result: Dictionary<String,ServerStatusResult>?, _ error: ServiceError?)->Void

func serverStatus(email: String, password: String, complete: @escaping serverStatusCompletedClosure) {
        let url = URL(string: "...")!
        try? self.httpClient.get(url: url,
                                token: "...",
                                email: email,
                                password: password)
        { (data, response, error) in
            if let error = error {
                complete(false, nil, ServiceError.invalidSession)
            } else if let httpResponse = response as? HTTPURLResponse {
                switch (httpResponse.statusCode) {
                case 200:
                    var result: [String:ServerStatusResult]? = nil
                    result = try! JSONSerialization.jsonObject(with: data!, options: []) as! Dictionary<String, ServerStatusResult>
                    complete(true, result, nil)

这是我的 json 转换失败的地方。

无法将“__NSDictionaryI”(0x7fff8eaee9b0)类型的值转换为“app.ServerStatusResult”(0x10021dec0)。

请问我错过了什么?

4

2 回答 2

1

您可以通过使用 Decodable 和使用字典来解决它

首先使您的结构符合Decodable

public struct ServerStatusResult: Decodable {
    public let vpnName: String
    public let status: Int

    enum CodingKeys: String, CodingKey {
        case vpnName = "vpn_name"
        case status = "vpn_status"
    }
}

然后解码很容易

do {
    let result = try JSONDecoder().decode([String: ServerStatusResult].self, from: data)
    print(result) //or in you case complete(true, result, nil)
} catch {
    print(error)
}
于 2020-04-03T08:31:10.713 回答
0

你得到一个字典数组[[String: Any]]

为字典创建一个结构,如果字典内部有另一个字典,则为内部字典创建另一个结构,并在外部结构中为内部字典 json 创建一个对象。

您可以通过使用codeable可编码继承您的结构来轻松解析您的 json

于 2020-04-03T08:25:57.810 回答