从"任意"转换到其他任何内容都会失败



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

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

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

我不知道该怎么做。有什么提示或解决方案吗?

终于有机会展示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协议为您提供了一种绝佳的方法,可以轻松地从StringsDatadecode。这个过程不应该被误认为是演员表,即使它看起来大致相同。它是从一个简单的Data创建和初始化另一个结构更合适的对象,您可能已经从您选择的普通 Web 服务中获得。

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

你可以像这样解析它,因为它是一个 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)
}
}

相关内容

  • 没有找到相关文章

最新更新