No utilicé archivos de terceros para llamar a la API, aquí está el código:

func CallWebService(_ methodType: NSString, methodName: NSString, inputDict: NSDictionary, completion: @escaping (_ result: [String:AnyObject]) -> Void, failure:(_ failurMSG: NSString)->())
{

do {
    let data: Data = try JSONSerialization.data(withJSONObject: inputDict, options: [])

    //create request
    let tmpString: String = "\(kBaseUrl)\(methodName)"
    let  urlString :String = tmpString.addingPercentEncoding( withAllowedCharacters: CharacterSet.urlQueryAllowed)!
    let urlRequest = NSMutableURLRequest(url: URL(string: urlString)!)
    urlRequest.httpMethod = methodType as String
    urlRequest.httpBody = data
    urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")


    let task : URLSessionDataTask! = URLSession.shared.dataTask(with: urlRequest as URLRequest, completionHandler: {
        (data, response, error) in

        if let _ = error
        {
            DispatchQueue.main.async(execute: {

            })

        }else{

            do {

                let dict = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]

                completion(dict)


            }catch{
            }
        }
    })

    task.resume()

} catch {
    DispatchQueue.main.async(execute: {

    })
    failure("Something goes wrong please try again.")
}

}

Mientras accedo a la API, recibí la siguiente respuesta:

["status": success, "category": {
    "file_image" = "http://abcds.com/cphp/26/uploads/pdf1.png";
    "file_name" = "1 \U0645\U0644\U0641 \U0627\U062e\U062a\U0628\U0627\U0631";
    "file_path" = "http://hghg/images/2311201663231Michael20plat20du20jour20correctd.pdf";
    id = 2;
    "sub_name" = "P12 \U0641\U0631\U0639\U064a\U0629";
}]

Este no es el formato correcto, ¿qué me estoy perdiendo?

Necesito que la salida sea:

{"status": success, "category": [
   "file_image" = "http://abcds.com/cphp/26/uploads/pdf1.png";
    "file_name" = "1 \U0645\U0644\U0641 \U0627\U062e\U062a\U0628\U0627\U0631";
    "file_path" = "http://hghg/images/2311201663231Michael20plat20du20jour20correctd.pdf";
    id = 2;
    "sub_name" = "P12 \U0641\U0631\U0639\U064a\U0629";
]
}
-4
MVKR 12 ene. 2017 a las 15:50
Creo que es un problema desde el lado del servidor. dile a tu chico de PHP que cambie esta respuesta
 – 
Jitendra Modi
12 ene. 2017 a las 15:54
Sus afirmaciones son incorrectas y su objeto es correcto. Este es un diccionario. Intente hacer dict["status"] verá. Una vez que haya convertido la parte AnyObject en un tipo útil real, verá que el resto del objeto también es correcto.
 – 
Eric Aya
12 ene. 2017 a las 15:58
Me parece que ESTÁS obteniendo un diccionario. La entrada "Status": success parece un par clave / valor. ¿Cómo muestra sus datos? Obtendrá un formato diferente dependiendo de cómo lo muestre, y no se verá como JSON una vez que lo haya convertido.
 – 
Duncan C
12 ene. 2017 a las 16:01
El tipo de PHP está enviando de manera correcta. ¿Podrías decirme si hay algún error en mi código?
 – 
MVKR
12 ene. 2017 a las 16:01
1
La salida real y esperada no son válidas.
 – 
shallowThought
12 ene. 2017 a las 16:50

1 respuesta

La mejor respuesta

Me parece que ESTÁS obteniendo un diccionario.

Editar:

De hecho, el hecho de que su código esté forzando la conversión de datos JSON para escribir [String:AnyObject] prueba que los resultados son un diccionario. Si no fuera así, la línea de lanzamiento forzado se estrellaría:

let dict = try JSONSerialization.jsonObject(with: data!, 
  options: .allowFragments) as! [String:AnyObject]

(La parte as! [String:AnyObject] de esa línea dice "Estoy seguro de que el valor se puede convertir al tipo [String:AnyObject]. De lo contrario, bloquee mi programa).

Intente agregar esto a su código:

print("dict type =" + String(describing:type(of:dict)))

Apuesto a que obtienes

dict type = Dictionary<String:AnyObject>

0
Community 20 jun. 2020 a las 12:12
1
Bueno, OP está haciendo as! [String:AnyObject] así que estamos seguros de que lo que tienen es un diccionario, de lo contrario se habrían quejado del infame error fatal ...;)
 – 
Eric Aya
12 ene. 2017 a las 16:18
Es cierto, pero mostrar el tipo de objeto es una herramienta de aprendizaje útil.
 – 
Duncan C
12 ene. 2017 a las 16:54
Si estoy escribiendo la finalización (String (describiendo: tipo (de: dict))) entonces está dando un error como no puedo convertir el valor de la cadena al tipo de argumento esperado '[String AnyObject]'
 – 
MVKR
13 ene. 2017 a las 07:22
¿Qué debo escribir para completar la operación deseada?
 – 
MVKR
13 ene. 2017 a las 07:22