我正在编写一个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"]
}