在 Swift 中将 socket.io 数据转换为 JSON



我正在编写一个socket.io客户端,但我无法将发出的数据转换为任何可用的格式。

我的处理程序是:

socket.on("foriEvent") { data, ack in
    print(data)
}

其中打印:

[  
   {  
      "foriEvent":{  
         "eventType":"location",
         "state":"moving",
         "latitude":"60.4413407",
         "longitude":"22.2476208",
         "accuracy":"20",
         "ts":1510653600189
      }
   }
]

我有一个"看起来"像该数据Struct,我想使用这样的东西,其中 from 对象类型为 Data .

let decoder = JSONDecoder()
let foriEvent = try decoder.decode(ForiEvent.self, from: data)

目前,我正在使用以下内容来获取数据对象,但是当我将其发送到decoder.decode时,我收到以下错误消息:

return try JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted)
error trying to convert data to JSON typeMismatch(Swift.Dictionary<Swift.String, Any>, 
Swift.DecodingError.Context(codingPath: [], debugDescription:
"Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

会不会是我的结构?它应该是什么样子的?Struct现在如下所示:

struct ForiEvent : Codable {
    var eventType: String?
    var state : String?
    var latitude: String?
    var longitude : String?
    var accuracy : String?
    var timeStamp : CLong?
}
struct ForiData : Codable {
    var foriEvent : ForiEvent?
}

我为此使用 swiftyjson。它做得很好。

尚未定义数据的类型,但如果它是一个字符串,看起来像是从您拥有的打印命令中,那么您可以执行此操作。

    guard let dataFromString = data[0].data(using: String.Encoding.utf8, allowLossyConversion: false) else {return}
    var swiftyJson:JSON!
    do {
        swiftyJson = try JSON(data: dataFromString)
    } catch {
        print("Error JSON: (error)")
    }

这将为您提供 JSON 格式的数据,您可以使用 swiftyjson 非常轻松地将其解析为您上面概述的自定义类型。Codable 可能无法正常工作的原因是您的 JSON 以 JSON 数组的形式返回。

试试这个

let tempVar = swiftyJson["foriEvent"]["eventType"].string
print("test (tempVar)") 
我认为

没有必要实现任何第三方(顺便说一句,我不反对 SwiftyJson 或任何其他(。您可以按以下方式执行此操作:

//Here is the new struct for your ForiEvent
struct ForiEvent {
var eventType: String?
var state : String?
var latitude: String?
var longitude : String?
var accuracy : String?
var timeStamp : CLong?
init(dict: [String:Any]) {
    if let obj = dict["eventType"] {
        eventType = "(obj)"
    }
    if let obj = dict["state"] {
        state = "(obj)"
    }
    if let obj = dict["latitude"] {
        latitude = "(obj)"
    }
    if let obj = dict["longitude"] {
        longitude = "(obj)"
    }
    if let obj = dict["accuracy"] {
        accuracy = "(obj)"
    }
    if let obj = dict["timeStamp"] as? CLong {
        timeStamp = obj
    }
}
}
//You data as [[String:Any]] returend from on complitionhandler
let dictArray:[[String:Any]] = [[
"foriEvent":[
    "eventType" : "location",
    "state":"moving",
    "latitude":"60.4413407",
    "longitude":"22.2476208",
    "accuracy":"20",
    "ts":1510653600189
]
]
]
print(dictArray)

// How to Use it:
var foriEventArray = [ForiEvent]()
for eventData in dictArray {
if let eventDict = eventData["foriEvent"] as? [String:Any] {
    foriEventArray.append(ForiEvent(dict: eventDict))
}
}
print(foriEventArray)

使用 SwiftyJSON 是处理 json 的最简单方法

使用此示例

socket.on("foriEvent") { data, ack in
   // because 'data' is type of [Any] so we can use 'JSON.init(AnyObject)'
   let json:JSON = JSON(data[0])//JSON.init(parseJSON: cur)
    // variable json is ready for use as this json["foriEvent"]
}

最新更新