Estoy pasando algún parámetro a la api , para añadir a la cesta de la función. Pero cuando me pasa el parámetro , se muestra el choque Invalid top-level type in JSON write' sé que no es el problema en mi paso de parámetros . Por favor, ayúdenme!.Cómo hacerlo.Por favor, ayúdenme !!!

Este es el formato json de parámetro estoy pasando !!:

{
    "cartType" : "1",
    "cartDetails" : {
        "customerID" : "u",
        "cartAmount" : "6999",  
        "cartShipping" : "1",
        "cartTax1" : "69",
        "cartTax2" : "",
        "cartTax3" : "",
        "cartCouponCode" : "",
        "cartCouponAmount" : "",
        "cartPaymentMethod" : "",
        "cartProductItems" : {
            "productID" : "9",
            "productPrice" : "6999",
            "productQuantity" : "1"
        }
    }
}

Mi solución actualizada :

func addtocartapicalling ()
{
let headers = [
"cache-control": "no-cache",
"postman-token": "4c933910-0da0-b199-257b-28fb0b5a89ec"
]
let jsonObj:Dictionary<String, Any> = [
"cartType" : "1",
"cartDetails" : [
"customerID" : "sathish",
"cartAmount" : "6999",
"cartShipping" : "1",
"cartTax1" : "69",
"cartTax2" : "",
"cartTax3" : "",
"cartCouponCode" : "",
"cartCouponAmount" : "",
"cartPaymentMethod" : "",
"cartProductItems" : [
"productID" : "9",
"productPrice" : "6999",
"productQuantity" : "1"
]
]
]
if (!JSONSerialization.isValidJSONObject(jsonObj)) {
print("is not a valid json object")
return
}
if let postData = try? JSONSerialization.data(withJSONObject: jsonObj, options: JSONSerialization.WritingOptions.prettyPrinted) {
let request = NSMutableURLRequest(url: NSURL(string: "http://expapi.php")! as URL,
cachePolicy: .useProtocolCachePolicy,timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
///print(error)
            } else {
DispatchQueue.main.async(execute: {
if let json = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? Dictionary<String,AnyObject>
{
let status = json["status"] as? Int;
if(status == 1)
{
print("SUCCESS....")
if (json["CartID"] as? Int?) != nil
{
DispatchQueue.main.async(execute: {
print("INSIDE CATEGORIES")
self.addtocartdata.append(Addtocartmodel(json:CartID))
})
}
}
}
})
}
})
dataTask.resume()
}
}

último problema en añadir los valores :

No válido tipo de nivel superior en JSON escribir'

En mi modelo de datos de la clase es este aspecto :

class Addtocartmodel
{
var cartid : Int?
init(json:NSDictionary)
{
self.cartid = json["CartID"] as? Int
}
}
así que lo que la razón real de error u obtener?

OriginalEl autor mack | 2016-10-23

2 Comentarios

  1. 7

    Su json tiene algún formato incorrecto.El uso de un diccionario es mucho más evidentes que en json en swift, y el uso JSONSerialization para convertir el diccionario de cadena json.

    El código se parece a esto:

    func addtocartapicalling ()
    {
    let headers = [
    "cache-control": "no-cache",
    "postman-token": "4c933910-0da0-b199-257b-28fb0b5a89ec"
    ]
    let jsonObj:Dictionary<String, Any> = [
    "cartType" : "1",
    "cartDetails" : [
    "customerID" : "sathish",
    "cartAmount" : "6999",
    "cartShipping" : "1",
    "cartTax1" : "69",
    "cartTax2" : "",
    "cartTax3" : "",
    "cartCouponCode" : "",
    "cartCouponAmount" : "",
    "cartPaymentMethod" : "",
    "cartProductItems" : [
    "productID" : "9",
    "productPrice" : "6999",
    "productQuantity" : "1"
    ]
    ]
    ]
    if (!JSONSerialization.isValidJSONObject(jsonObj)) {
    print("is not a valid json object")
    return
    }
    if let postData = try? JSONSerialization.data(withJSONObject: jsonObj, options: JSONSerialization.WritingOptions.prettyPrinted) {
    let request = NSMutableURLRequest(url: NSURL(string: "http://expapi.php")! as URL,
    cachePolicy: .useProtocolCachePolicy,timeoutInterval: 10.0)
    request.httpMethod = "POST"
    request.allHTTPHeaderFields = headers
    request.httpBody = postData
    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
    if (error != nil) {
    print(error)
    } else {
    DispatchQueue.main.async(execute: {
    if let json = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? Dictionary<String,AnyObject>
    {
    let status = json["status"] as? Int;
    if(status == 1)
    {
    print("SUCCESS....")
    print(json)
    if let CartID = json["CartID"] as? Int {
    DispatchQueue.main.async(execute: {
    print("INSIDE CATEGORIES")
    print("CartID:\(CartID)")
    self.addtocartdata.append(Addtocartmodel(json:json))
    })
    }
    }
    }
    })
    }
    })
    dataTask.resume()
    }
    }
    Así que el jsonstr es mi parámetro para pasar a la api de derecho >>
    Soy nuevo en ios, no sé cómo hacer que el método http para pasar a mi api. Por favor, puedes editar tu solución con mis capturas cosa también. Por lo que será útil para entender el flujo de
    OK, he de actualizar mi respuesta.
    Gracias por la solución, me han usarlo. después de pasar el parámetro a de la api, voy a tener la { "status": 1, "message": "Cart values has been added successfully.", "CartID": 5 } como este. Pero no estoy obteniendo y también no llegar en mi db también
    Y necesito almacenar este cartID Valor o de lo contrario tienen que anexar a mi modelo de datos de la clase.

    OriginalEl autor Dr.Sun

  2. 2

    Hay una sutil diferencia

    Trate de usar este

    JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] 

    lugar de

    JSONSerialization.data(withJSONObject: data, options: []) as? [String:AnyObject]
    por favor, ayudar a resolver este No puede invocar jsonObject con una lista de argumentos de tipo ‘(con:Cualquiera, opciones: [Cualquier])’
    Pruebe una de estas soluciones stackoverflow.com/a/43986831/5438240

    OriginalEl autor Naishta

Dejar respuesta

Please enter your comment!
Please enter your name here