Arrays 如何解析Swift 3中的数组

Arrays 如何解析Swift 3中的数组,arrays,json,swift,Arrays,Json,Swift,我有一些JSON,但它在一个矩阵中,我不知道如何分别获取值。例如,获取姓氏 这是JSON结构: { "login": true, "token": "m5CnQ", "usuario": [ { "names": "Sergio Alejandro", "las_name": "Rosado", } ] } 这是我的代码: do { print("reci

我有一些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()

您是否尝试过usuario[0]。las_name

如果您使用的是Swift 4,请使用新的
可解码协议:

首先定义数据模型:

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)
}

我这样解决了我的问题:

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()

是这个吗?var nombre=json[“usuario[0].las_name”]我认为它是json[“usuario”][0][“las_name”]
json
是一个
[String:Any]
,而不是
[String:String]
。然后,nombre应该是
let usuario=json[“usuario”]作为[[String:String]];让lastName=usuario[0][“las_name”]
我这样写:如果让json=try JSONSerialization.jsonObject(with:data,options:JSONSerialization.ReadingOptions.allowFragments)作为?[String:Any]{DispatchQueue.main.async{//proceso principal//var nombre=json[“nombre”]//constante let usuario=json[“usuario”]as![[String:String]];let lastName=usuario[0][“lastu name”]出现此错误:无法将“\u NSDictionaryI”(0x107abd428)类型的值强制转换为“NSArray”(0x107abcf28)。2018-03-05 17:51:49.807395-0600 web服务[8970:240489]无法将“\u NSDictionaryI”(0x107abd428)类型的值强制转换为“NSArray”(0x107abcf28)。因此我倾向于说您提供的JSON不是真实的。对于“usuario”而不是“usuarios”关联的值是一个数组。是的,它起作用了,但现在如何在变量中分离模型?为了获得数据,我编写了:“print(model.user)”和print:user in MyDataModel#1 in web#services.ViewController.pedirDatos()->()(id:Optional(“36”),id_empresa:Optional(“1”),nombres:Optional(“Sergio Alejandro)、apellido_paterno:Optional(“Rosado”)、apellido_materno:Optional(“Dzul”)、id_perfil:Optional(“1”)、用户名:Optional(“empleadodemo”)、activo:Optional(“1”)、住所:Optional(“1”)、cp:Optional(“1”)、电话号码:Optional(“1”)、电话号码:Optional”(“Optional”)、Usario:Optional(“1”)]谢谢我用这种方式解决了我的问题:打印(model.user[0]。姓氏)