0

API 给了我一个类型为 的变量Any。当我打印它时,它看起来像这样。

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

我试图用SwiftyJSON这样的方式投射它,let mydata = JSON(data)但它失败了。我尝试使用 Swift 4 解码技术,但也失败了。我试图这样做,let myData = data as? Dictionary<String, String>但它再次失败。

我不知道在这里做什么。任何提示或解决方案?

4

2 回答 2

1

最后有机会展示其中一个Codable隐藏的协议。请在 Playground 中运行以下命令:

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 服务中获得了这些信息。

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

于 2018-05-09T22:11:47.233 回答
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)
     }
}
于 2018-05-07T21:57:37.017 回答