Arrays 如何解析Swift 3中的数组
我有一些JSON,但它在一个矩阵中,我不知道如何分别获取值。例如,获取姓氏 这是JSON结构: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
{
"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]。姓氏)