在Swift

时间:2017-11-15 20:08:02

标签: ios json swift socket.io

我正在编写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?
}

3 个答案:

答案 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)