Cómo puedo descargar este JSON con Swift


#1

Hola amigos, Intento descargar un JSON pero con mi poca experiencia no sé que es lo estoy haciendo mal, agradezco la ayuda, saludos desde Tabasco.

{
    "status": "400",
    "message": "Usuario ya registrado",
    "result": [
        {
            "id_UsuariosClientes": 1,
            "nombreCliente": "Rodrigo",
            "apesCliente": "Sánchez Corona",
            "numeroTarjeta": 987654321,
            "tarjetaRegaloCliente": 0,
            "nomUsuarioCliente": "rockyto",
            "psswdUsuarioCliente": null,
            "mailUsuarioCliente": "rocky_saco@hotmail.com",
            "telUsuarioCliente": 993182,
            "tipoTarjetaCliente": "Membresia",
        "fotoClienteUsuario": null,
        "registroCliente": "2019-04-29 14:48:36",
        "cumpleCliente": "1990-10-26",
        "salt": null,
        "tipoRegistro": "GENTS"
    }
]
}

este es mi código en swift

let mailCliente = fields["email"] as? String ?? ""
                
                let myURL = NSURL(string: "http://localhost:8888/GentsMovil/controller/registroFB.php")
                let request = NSMutableURLRequest(url:myURL! as URL)
                request.httpMethod = "POST"
                
                let postString = "mail=\(mailCliente)"
                request.httpBody = postString.data(using: String.Encoding.utf8)
                URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
                    DispatchQueue.main.async{
                        if error != nil {
                            self.displayAlertMessage(userMessage: (error?.localizedDescription)!)
                            return
                        }
                        let _: NSError?
                        let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                        if let parseJSON = json{
                            //Abre la vista de inicio si existe en el servidor una cuenta de correo ya registrada
                            let statusServidor = parseJSON?["status"] as? String

                            if(statusServidor == "400"){
                               //self.displayAlertMessage(userMessage: statusServidor!)
                                let vistaInicio = (self.storyboard?.instantiateViewController(withIdentifier: "vistaInicio") as? UINavigationController)
                                let appDelegate = UIApplication.shared.delegate
                                appDelegate?.window??.rootViewController = vistaInicio
                            //Abre la ventana de registro si no existe una cuenta de correo ya existente en el servidor
                            }

#2

Hola, puedes hacerlo asi:

if let parseJSON = json{
                            //Abre la vista de inicio si existe en el servidor una cuenta de correo ya registrado
  let statusServidor = parseJSON?["status"] as? String

                            if(statusServidor == "400"){
If let  results = parseJSON[“result”] as array{
   let datosUsuario = results.first
   // datosUsuario trae los elementos que necesitas para obtenerlos ya solo extraelos de manera  datosUsuario["nombreCliente"] as? String
  }
                               //self.displayAlertMessage(userMessage: statusServidor!)
                                let vistaInicio = (self.storyboard?.instantiateViewController(withIdentifier: "vistaInicio") as? UINavigationController)
                                let appDelegate = UIApplication.shared.delegate
                                appDelegate?.window??.rootViewController = vistaInicio
                            //Abre la ventana de registro si no existe una cuenta de correo ya existente en el servidor
                            } ```

#3

Gracias por tu ayuda amigo, lamentablemente no funcionó T_T


#4

Por qué a tu constante json donde haces la JSONSerialization la conviertes a un NSDictionary y no a un [String: Any]?


#5

Hola! Gracias por tu aporte, tampoco así :sweat_smile:


#6

Pero entonces si estás enviando corerctamente tu request, quizás el htppBody? Ni siquiera el error del complition handler del URLSession te dice algoc como erro 404, URL not found u otra cosa.


#7

Si estás utilizando Swift 4 o 4.2 en adelante, puedes utilizar una clase que se llama Codable para serializar tus datos. Sin necesidad de incluir otras librerias como Swifty. Aqui puedes ver un ejemplo de como hacerlo.

Saludos!


#8

Lo intenté y nada :frowning:

import UIKit
import FBSDKLoginKit

struct Response: Codable {
    var status : String
    var message: String
    let result: [Result]
}

struct Result: Codable {
    let idUsuariosClientes: Int
    let nombreCliente, apesCliente: String
    let numeroTarjeta, tarjetaRegaloCliente: Int
    let nomUsuarioCliente: String
    let mailUsuarioCliente: String
    let telUsuarioCliente: Int
    let tipoTarjetaCliente: String
    let registroCliente, cumpleCliente: String
    let tipoRegistro: String
    
    enum CodingKeys: String, CodingKey {
        case idUsuariosClientes = "id_UsuariosClientes"
        case nombreCliente, apesCliente, numeroTarjeta, tarjetaRegaloCliente, nomUsuarioCliente, mailUsuarioCliente, telUsuarioCliente, tipoTarjetaCliente, registroCliente, cumpleCliente, tipoRegistro
    }
}

class ViewController: UIViewController {
    @IBOutlet weak var btnFB: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //self.btnPreguntar.layer.cornerRadius = 5
        self.btnFB.layer.cornerRadius = 5
        
        if (FBSDKAccessToken.current() != nil){
            print("Logueado")
            camposUsuario()
        }else{
            print("Sin loguearse")
        }
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    //Botón para iniciar sesión
    @IBAction func fbloginBtn(_ sender: UIButton) {
        loginFB()
    }
    
    
    //Función para disque poner la barra de estado con letras blancas
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    
    
    //Función para iniciar sesión con Facebook
    func loginFB(){
        
        FBSDKLoginManager().logIn(withReadPermissions: ["email", "public_profile"], from: nil) {
            (result, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            guard let result = result else {return}
            if result.isCancelled{
                return
            }else{
                self.camposUsuario()
            }
        }
        
    }
    
    func camposUsuario(){
        
        FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "first_name, last_name, birthday, email, picture.type(large)"]).start {(conexion, result, error) in
            if let error = error {
                print(error.localizedDescription)
            }
            if let fields = result as? [String:Any]{
                
                let nombreCliente = fields["first_name"] as? String ?? ""
                let apellidoCliente = fields["last_name"] as? String ?? ""
                let mailCliente = fields["email"] as? String ?? ""
                
                let myURL = NSURL(string: "http://localhost:8888/GentsMovil/controller/registroFB.php")
                let request = NSMutableURLRequest(url:myURL! as URL)
                request.httpMethod = "POST"
                
                let postString = "mail=\(mailCliente)"
                request.httpBody = postString.data(using: String.Encoding.utf8)
                URLSession.shared.dataTask(with: request as URLRequest, completionHandler:{ (data, response, error) in
                DispatchQueue.main.async {
                    
                    if let e = error {
                        self.displayAlertMessage(userMessage: e.localizedDescription)
                        return
                    }
                            do{
                                let response = try? JSONDecoder().decode(Response.self, from: data!)
                                if let firstResult = response?.result.first {
                                    UserDefaults.standard.set(firstResult.nombreCliente, forKey: "nombreCliente")
                                }
                                if response?.status == "400" {
                                    
                                    let vistaInicio = (self.storyboard?.instantiateViewController(withIdentifier: "vistaInicio") as? UINavigationController)
                                    
                                    let appDelegate = UIApplication.shared.delegate
                                    
                                    appDelegate?.window??.rootViewController = vistaInicio
                                    
                                    //Abre la ventana de registro si no existe una cuenta de correo ya existente en el servidor
                                    
                                } else if response?.status == "404"{
                                    //Se descargan los datos desde Facebook
                                    UserDefaults.standard.set(fields["first_name"], forKey: "first_name")
                                    UserDefaults.standard.set(fields["last_name"], forKey: "last_name")
                                    UserDefaults.standard.set(fields["email"], forKey: "email")
                                    UserDefaults.standard.set(fields["picture"], forKey: "picture")
                                    UserDefaults.standard.set(fields["birthday"], forKey: "birthday")
                                    UserDefaults.standard.synchronize()
                                    
                                    let Perfil = (self.storyboard?.instantiateViewController(withIdentifier: "verificaPerfil") as? UINavigationController)
                                    let appDelegate = UIApplication.shared.delegate
                                    appDelegate?.window??.rootViewController = Perfil
                                }
                            }catch{
                                print(error)
                            }
                        }
            }).resume()
            }
        }
    }
    func displayAlertMessage(userMessage:String){
        
        let myAlert = UIAlertController(title: "Atención", message: userMessage, preferredStyle: UIAlertController.Style.alert);
        let okAction =  UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)
        myAlert.addAction(okAction);
        self.present(myAlert, animated: true, completion:nil)
        
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        if (UserDefaults.standard.object(forKey: "tuto") != nil){
            return
        }else{
            if let inicioVC = storyboard?.instantiateViewController(withIdentifier: "tutorial") as? PaginacionViewController{
                self.present(inicioVC, animated: true, completion: nil)
            }
        }
    }
}

#9

yo uso https://quicktype.io para crear rápido el modelo de datos usando el json, y por lo que compartiste al principio me genero un modelo así:


esta herramienta te permite configurar el lenguaje y otros atributos :smiley: espero sea de tu ayuda


#10

estas usando swiftyJSON? si es así, intenta colocar - parseJSON[“result”].arrayValue en vez de as? Array