从Any转换为其他任何东西都失败了

时间:2018-05-07 21:48:55

标签: swift ably-realtime

API为我提供了一个类型为Any的变量。我打印时看起来像这样。

{
  "sender" : "Kira",
  "created" : "08.05.2018",
  "text" : "Cncncm"
}

我尝试使用SwiftyJSONlet mydata = JSON(data)一样投射它,但它很糟糕。我尝试使用Swift 4解码技术,但也失败了。我尝试这样做let myData = data as? Dictionary<String, String>但它又失败了。

我不知道该怎么做。任何提示或解决方案?

2 个答案:

答案 0 :(得分:1)

最后有机会展示其中一个Codable协议隐藏的宝石。请在游乐场中运行以下内容:

import Cocoa

let jsonData = """
    {
      "sender" : "Kira",
      "created" : "08.05.2018",
      "text" : "Cncncm"
    }
    """.data(using: .utf8)!

struct SenderText: Codable {
    let sender: String
    let created: Date
    let text: String
}

let dayFormatter = DateFormatter()
dayFormatter.dateFormat = "dd.MM.yyyy"
let date = dayFormatter.date(from:"08.05.2018")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dayFormatter)

do {
    let sendText = try decoder.decode(SenderText.self, from: jsonData)
    print(sendText)
} catch {
    print(error)
}

定义这样一个复杂的解析器,将一个混乱的JSON字符串映射到你最喜欢的struct是多么容易的绝对优雅,几乎不会让我感到惊讶。无论您的日期格式多么奇怪,在此过程中距离解析的距离不超过3行。

关于转换有一些事情你应该注意:在Swift中,就像在大多数面向对象的语言中一样,如果(并且只有)它已经,你只能某些东西投射到别的东西上>首先是其他东西(但知识已在某处丢失)。由于您的String只是“{”String(可能伪装成Any),您将无法投射到其他任何地方。但是,Codable协议以极其轻松的方式为decode Strings Data提供了极好的方法。这个过程不应该被误认为是演员,即使它看起来大致相同。它是从一个简单的Data部分创建和初始化另一个更合适的结构化对象,您可能从您选择的普通Web服务中获得这些对象。

到目前为止很棒,至少在我的书中。

答案 1 :(得分:0)

您可以像这样解析它,因为它是一个json字符串

let trd = yourVar as? String

if let data = trd?.data(using: String.Encoding.utf8) {

   do {
           var content = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:String]

           print(content)

      } 
      catch let error as NSError {

           print(error)
     }
}