Json Swift 2没有进入

时间:2016-05-17 13:17:39

标签: ios json swift

我有这个方法来阅读JSON

func conecta(){
let myUrl = NSURL(string: "myWebService");let request = NSMutableURLRequest(URL:myUrl!);
request.HTTPMethod = "POST";

// Compose a query string
let postString = "username=\(userWS)&password=\(passWS)&servidor=\(servidor)"


request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
    data, response, error in
    if error != nil
    {
        print("error=\(error)")
        return
    }

    let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
    var err: NSError?
    do{
        let myJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)




        if let empresas = myJSON["TablaEmp"]!!["item"] as? [[String: AnyObject]] {
            for empresa in empresas {
                let zcif = empresa["Zcif"] as? String
                let zcccp = empresa["Zcccp"] as? String
                let zfax = empresa["Zfax"] as? String
                let zdocu = empresa["Zdocu"] as? String
                self.arrayEmpresas.append([zcif!, zcccp!, zfax!, zdocu!])
            }
        }


        print("muestro: \(self.arrayEmpresas)")

    }catch { print(error)}
}
task.resume()
}

我的JSON就是这样的:

{"TablaEmp":{"item":[{"Zcif":"123","Zcccp":"456","Zfax":"789","Zdocu":"000"}]}}

我没有错误,只是没有进入我的。

我打印myJSON变量并显示完美的JSON,我认为必须是这条道路。

 if let empresas = myJSON["TablaEmp"]!!["item"] as? [[String: AnyObject]] {

由于

修改

调试

enter image description here

tablaEmp有“item”但没有进入函数

EDIT2:

我尝试了另一个代码

func conecta(){
    let request = NSMutableURLRequest(URL: NSURL(string: "myWS")!)
    request.HTTPMethod = "POST"
    let postString = "username=\(userWS)&password=\(passWS)&servidor=\(servidor)"
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
        guard error == nil && data != nil else {
            print("error=\(error)")
            return
        }

        if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(response)")
        }


        let responseString = NSData(data: data!)

        do {
            let jsonDict = try NSJSONSerialization.JSONObjectWithData(responseString, options: NSJSONReadingOptions(rawValue: 0)) as? NSDictionary
            if let jsonDict = jsonDict {

                let jsontabla = jsonDict["TablaEmp"]!["item"]
                print("Cargando array")
                for empresa in jsontabla as! [Dictionary<String, AnyObject>] {

                    let zcif = empresa["Zcif"] as? String
                    let zcccp = empresa["Zcccp"] as? String
                    let zfax = empresa["Zfax"] as? String
                    let zdocu = empresa["Zdocu"] as? String
                    self.arrayEmpresas.append([zcif!, zcccp!, zfax!, zdocu!])


                }
                print("muestro: \(self.arrayEmpresas)")




            } else {
                print("No hay valores")
            }
        } catch let error as NSError {
            print(error)
        }

    }
    task.resume()
}

无法将'__NSCFDictionary'(0x10c0ee178)类型的值转换为'NSArray'(0x10c0edb88)。

什么都不懂,我的第一个代码必须工作

最终编辑

我发现了问题。当我的webservice只返回一个值时,json就是这样:

{"TablaEmp":{"item":{"othervalues":"500","Zcif":"1111"}}} 

没有[],这就是不工作的原因。我该如何解决?

1 个答案:

答案 0 :(得分:1)

到目前为止,您已发布了两个演示JSON和两个版本的代码。我已经测试过两者兼而有之。请参阅以下最小示例:

// let jsonString = "{\"TablaEmp\":{\"item\":[{\"Zcif\":\"123\",\"Zcccp\":\"456\",\"Zfax\":\"789\",\"Zdocu\":\"000\"}]}}"
let jsonString = "{\"TablaEmp\":{\"item\":[{\"othervalues\":\"sssss\",\"Zcif\":\"111\"},{\"othervalues\":\"sssss\",\"Zcif\":\"111\"},{\"othervalues\":\"sssss\",\"Zcif\":\"111\"}]}}"

let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)

let myJSON = try! NSJSONSerialization.JSONObjectWithData(jsonData!, options: .AllowFragments)

// code 1
if let empresas = myJSON["TablaEmp"]!!["item"] as? [[String: AnyObject]] {
    for empresa in empresas {
        print("Empresa")
    }
}

// code 2
if let jsonDict = myJSON as? NSDictionary {
    let jsontabla = jsonDict["TablaEmp"]!["item"]
    for empresa in jsontabla as! [Dictionary<String, AnyObject>] {
        print("Empresa")
    }
}

唯一可能的解释是您的JSON具有不同的形式。不要试图在代码中找到错误,代码适用于您发布的JSON。问题是JSON是不同的。

处理单值和多值的一种解决方案:

let jsonEmpresas = myJSON["TablaEmp"]!!["item"]
let empresas: [[String: AnyObject]]

if let multipleEmpresas = jsonEmpresas as? [[String: AnyObject]] {
    empresas = multipleEmpresas
} else if let singleEmpresa = jsonEmpresas as? [String: AnyObject] {
    empresas = [singleEmpresa]
} else {
    empresas = []
}

// or "for empresa in empresas"
empresas.forEach { empresa in
    let zcif = empresa["Zcif"] as? String
    print(zcif)
}