API为我提供了一个类型为Any
的变量。我打印时看起来像这样。
{
"sender" : "Kira",
"created" : "08.05.2018",
"text" : "Cncncm"
}
我尝试使用SwiftyJSON
像let mydata = JSON(data)
一样投射它,但它很糟糕。我尝试使用Swift 4解码技术,但也失败了。我尝试这样做let myData = data as? Dictionary<String, String>
但它又失败了。
我不知道该怎么做。任何提示或解决方案?
答案 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)
}
}