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
协议为您提供了一种绝佳的方法,可以轻松地从Strings
Data
中decode
。这个过程不应该被误认为是演员表,即使它看起来大致相同。它是从一个简单的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)
}
}