API返回了一个类型为Any的变量。当我打印它时,它看起来像这样。
{
"sender" : "Kira",
"created" : "08.05.2018",
"text" : "Cncncm"
}我尝试使用SwiftyJSON将它转换为这个let mydata = JSON(data),但是失败了。我尝试使用Swift 4解码技术,但也失败了。我试着这样做,let myData = data as? Dictionary<String, String>,但它再次失败。
我不知道在这里该怎么办。有什么建议或解决方案吗?
发布于 2018-05-10 06:11:47
最后,我们有机会来演示一下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-string映射到您最喜欢的struct是多么容易,这种纯粹的优雅几乎不会让我感到惊讶。不管你的日期格式看起来有多奇怪,在这个过程中它离解析只有3行之遥。
在Swift中,就像在大多数面向对象的语言中一样,只有当(且仅当)某个对象已经是其他对象时(但该知识已经在某个地方丢失),才能将该对象强制转换为其他对象。由于您的String“仅仅”是一个String (也许是在Any的掩饰下),您将无法将其转换为其他任何类型。但是,Codable协议为您提供了一种极好的方法,可以非常轻松地从Strings Data执行decode操作。这个过程不应该被误认为是造型,即使它看起来大体相同。它是从一段简单的Data中创建和初始化另一个更合适的结构化对象,您很可能已经从您的普通web服务中选择了它。
到目前为止还不错,至少在我的书里是这样。
发布于 2018-05-08 05:57:37
您可以这样解析它,因为它是一个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)
}
}https://stackoverflow.com/questions/50222930
复制相似问题