我有这个方法来阅读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]] {
由于
修改:
调试
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"}}}
没有[],这就是不工作的原因。我该如何解决?
答案 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)
}