我正在编写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)
目前我正在使用以下内容来获取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?
}
答案 0 :(得分:1)
我使用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)")
答案 1 :(得分:1)
使用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"]
}
答案 2 :(得分:0)
我认为没有必要实施任何第三方(顺便说一句,我不会再使用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)