如何在Swift 3中解析数组

时间:2018-03-05 17:18:34

标签: arrays json swift

我有一些JSON,但它在矩阵中,我不知道如何分别获取值。例如,获取姓氏。

这是JSON结构:

{
    "login": true,
    "token": "m5CnQ",
    "usuario": [
        {

            "names": "Sergio Alejandro",
            "las_name": "Rosado",

        }
    ]
}

这是我的代码:

    do {
        print("recibimos respuesta")

        let responseString = String(data: data, encoding: .utf8)
        print("respuesta : \(responseString)")

        if let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: String] {
            DispatchQueue.main.async {//proceso principal
                var nombre = json["nombre"]//constante

                print("respuestanom : \(nombre)")
            }
        }
    } catch let parseError {//manejamos el error
        print("error al parsear: \(parseError)")
        let responseString = String(data: data, encoding: .utf8)
        print("respuesta : \(responseString)")
    }
}
task.resume()

3 个答案:

答案 0 :(得分:0)

你试过usuario [0] .las_name

吗?

答案 1 :(得分:0)

如果您使用的是Swift 4,请使用新的Decodable协议:

首先定义您的数据模型:

struct MyDataModel: Decodable {
    struct User: Decodable {
        var names: String
        var lastName: String

        private enum CodingKeys: String, CodingKey {
            case names, lastName = "las_name"
        }
    }

    var login: Bool
    var token: String
    var user: [User]

    private enum CodingKeys: String, CodingKey {
        case login, token, user = "usuario"
    }
}

然后解码非常简单:

do {
    let model = try JSONDecoder().decode(MyDataModel.self, from: data)
    print(model)
} catch let parseError {
    print(parseError)
}

答案 2 :(得分:0)

我以这种方式解决了我的问题:

JSON:

{
"login": "TRUE",
"token": "eyJ0eXAiOiJKV12la70",
"usuario": [
    {
        "id": "36",
        "id_empresa": "1",
        "nombres": "Sergio Alejandro",
        "apellido_paterno": "Rosado",
        "apellido_materno": "Dzul",
        "zona_horaria": "America/Merida",
        "id_perfil": "1",
        "correo": "russelalexis123@gma.com",
        "username": "empleadodemo",
        "passwd": "*A4B6157319038724E3560894F7F932C8886EBFCF",
        "activo": "1",
        "fh_captura": "2017-02-20 21:02:55",
        "domicilio": "",
        "cp": "",
        "telefono": "",
        "usuario": "1",
        "no_licencia": null,
        "fecha_expedicion": null,
        "fecha_vigencia": null
    }
]

}

<强>码

struct MyDataModel: Decodable {
        struct User: Decodable {
            var id: String?
            var id_empresa: String?
            var nombres: String?
            var apellido_paterno: String?
            var apellido_materno: String?
            var zona_horaria: String?
            var id_perfil: String?
            var correo: String?
            var username: String?
            var activo: String?
            var fh_captura: String?
            var domicilio: String?
            var cp: String?
            var telefono: String?
            var usuario: String?
            private enum CodingKeys: String, CodingKey {
                case id="id", id_empresa="id_empresa", nombres="nombres", apellido_paterno="apellido_paterno", apellido_materno="apellido_materno", zona_horaria="zona_horaria", id_perfil="id_perfil", correo="correo", username="username", activo="activo", fh_captura = "fh_captura", domicilio="domicilio", cp="cp", telefono="telefono", usuario="usuario"
            }
        }

        var login: String
        var token: String
        var user: [User]

        private enum CodingKeys: String, CodingKey {
            case login, token, user = "usuario"
        }
    }


    print("envar solicitud")

    let url = URL(string: "http://webservice")!

    var request = URLRequest(url: url)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type");
    request.httpMethod = "POST"
    let postString = "usuario=jose&password=1234"
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else {//si existe un error se termina la funcion
            print("solicitud fallida \(error)")//manejamos el error
            return //rompemos el bloque de codigo
        }

        do {
            let model = try JSONDecoder().decode(MyDataModel.self, from: data)
            print(model.user[0].correo)
        } catch let parseError {
            print(parseError)
        }
    }
    task.resume()