【发布时间】:2020-07-17 05:01:35
【问题描述】:
基本上,我已经正确解析了我的数据。但是,当我尝试访问数据时。它声称我正在尝试将非属性列表对象插入到 UserDefaults 数组中。我如何能够以某种方式将其转换为属性列表对象?或者我如何能够将 JSON 数组存储为字符串?
var status = UserDefaults.standard.array(forKey: "status") ?? []
struct Response: Codable {
let weather: [MyResult]
}
struct MyResult: Codable {
let main: String
}
func getData(from url:String) {
URLSession.shared.dataTask(with: URL(string:url)!, completionHandler: {
data, response, error in
guard let data = data, error == nil else {
print("Something went wrong")
return
}
// have data
var result: Response?
do {
result = try JSONDecoder().decode(Response.self, from: data)
} catch {
print(error.localizedDescription)
}
guard let json = result else {
return
}
print(type(of: json.weather)) // Array
UserDefaults.standard.set(json.weather, forKey: "status") // Here is the error
print(status)
}).resume()
}
编辑:当我打印状态时,什么都没有。
func getData(from url:String) {
URLSession.shared.dataTask(with: URL(string:url)!, completionHandler: {
data, response, error in
guard let data = data, error == nil else {
print("Something went wrong")
return
}
// have data
var result: Response?
do {
result = try JSONDecoder().decode(Response.self, from: data)
} catch {
print(error.localizedDescription)
}
guard let json = result else {
return
}
print(type(of: json.weather)) // Array
do {
// Store it with
let data = try JSONEncoder().encode(json.weather)
UserDefaults.standard.set(data, forKey: "status")
// Read it
if let data = UserDefaults.standard.data(forKey:"status") {
let res = try JSONDecoder().decode([MyResult].self,from:data)
}
}
catch {
print(error)
}
print(status)
}).resume()
}
【问题讨论】:
-
您正在存储
MyResult的数组。这不是 JSON。您需要将其编码回来。并且永远不要打印像"Something went wrong"这样无意义的文字字符串,而不是实际的error。并且在Codable捕获块打印始终error而不是error.localizedDescription。