2016-08-01 51 views
1

我从插座IO库的响应与类似这样的解析数据迅速

socket.on("response-names") {data, ack in 
 
      print(data) 
 
     }

可以打印此响应,

[{ 
    "person": [{ 
     "_id":"56512323212132", 
     "name":"John Smith", 
     "id":"0000001", 
     "geolocation":{ 
      "latitude":5.12312323443, 
      "longitude":101.12312464564354 
     } 
    }] 
}] 

你们如何在swift中访问名称,id和地理位置(lat,long),

据我所知,数据是NSArray。但访问是与数据[0]将产生零。但我可以做data.count这将返回从1

谢谢

+0

它不是一个数组。它的字典。所以试试数据[“人”] –

+0

这是JSON。在尝试获取值之前,您需要了解JSON的结构。试试数据[0] [“人”]?数据[0]应该给你结果(而不是零),但是如果你试图将其转换为NSArray,那就错了。你的代码要序列化? – Larme

+0

@larme尝试数据[0] [“person”]产生“致命错误:意外地发现零,而解包可选值”我不写我的序列化代码,因为我想先尝试访问名称。谢谢 – damniatx

回答

0

最后我解决了这个问题,只是为他人日后参考。看起来你需要在分析它之前知道类型。并打印检查。 和调试代码真的有帮助,像NSCFArray这样的东西意味着你的数据作为NSArray并尝试从中读取。

let dataArray = data as NSArray 

      let dataString = dataArray[0] as! String 
      let dataNewNow = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 

      do { 
       let json = try NSJSONSerialization.JSONObjectWithData(dataNewNow, options: []) as! [String: AnyObject] 

       let str = json["person"] as! NSArray 
       let str2 = str[0] as! NSDictionary 

       let personName = str2["name"] as! String 
       let personId = str2["id"] as! String 

       let personGeoLocation = str2["geolocation"] as! NSDictionary 
       let personLatitude = personGeoLocation["latitude"] as! NSNumber 
       let personLongitude = personGeoLocation["longitude"] as! NSNumber 

       print("personName =", personName) 
       print("personID =", personId) 
       print("Person Latitude =", personLatitude) 
       print("Person Longitude =", personLongitude) 

      } catch let error as NSError { 
       print("Failed to load: \(error.localizedDescription)") 
      } 
0
我的情况

这个工作

let dataArray = data as NSArray 
let dataString = dataArray[0] as! String 
let dataNewNow = dataString.data(using: String.Encoding.utf8, allowLossyConversion: false)! 
do { 
let json = try JSONSerialization.jsonObject(with: dataNewNow, options: []) as! [String: AnyObject] 
let nMsgType = json["msg_type"] as! String 
print(nMsgType) 

} catch let error as NSError { 
print("Failed to load: \(error.localizedDescription)") 
}