【问题标题】:Parse data from socket.io response swift快速解析来自 socket.io 响应的数据
【发布时间】:2016-08-01 11:43:39
【问题描述】:

我有来自套接字 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
        }
     }]
}]

你们如何快速访问名称、id 和地理位置(纬度、经度)?,

据我所知,数据是 NSArray。但是使用 data[0] 访问将产生 nil。但我可以做 data.count 将返回 1。

谢谢

【问题讨论】:

  • 它不是一个数组。它的字典。所以试试 data["person"]
  • 它是 JSON。在尝试获取值之前,您需要了解 JSON 的结构。试试数据[0][“人”]? data[0] 应该给你结果(不是零),但如果你试图将 is 转换为 NSArray,那就错了。你要序列化的代码是什么?
  • @larme Try data[0]["person"] 产生“致命错误:在展开可选值时意外发现 nil”我还没有编写序列化代码,因为我想尝试访问先说名字。谢谢

标签: ios arrays swift socket.io


【解决方案1】:

最后我解决了,仅供其他人参考。看起来您需要在解析它之前知道类型。并用打印检查。 并且调试代码确实有帮助,例如NSCFArray 表示您的数据为NSArray 并尝试从中读取。

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 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)")
}

【讨论】:

    【解决方案2】:

    在我的情况下这是有效的

    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)")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2023-03-20
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多