【发布时间】:2021-10-14 16:30:01
【问题描述】:
我正在尝试从下面的 JSON Array 中获取 author 和 download_url。
[
{
"id": "0",
"author": "Alejandro Escamilla",
"width": 5616,
"height": 3744,
"url": "https://unsplash.com/photos/yC-Yzbqy7PY",
"download_url": "https://picsum.photos/id/0/5616/3744"
},
{
"id": "1",
"author": "Alejandro Escamilla",
"width": 5616,
"height": 3744,
"url": "https://unsplash.com/photos/LNRyGwIJr5c",
"download_url": "https://picsum.photos/id/1/5616/3744"
} ]
创建了一个 ImageStruct 来将 JSON 的数据转换为 ImageStruct 对象。
struct ImageData: Codable {
var author: String
var dataURL : String
}
我的 JSON 解码处理是在一个名为 JSONDecodeHandler 的结构的函数中完成的。处理解码的函数称为 jsonDecode,输入参数为“data”
struct JSONDecodeHandler {
static let shared = JSONDecodeHandler()
let decoder = JSONDecoder()
func jsonDecode(data: Data) {
do {
let decodedData = try decoder.decode([ImageData].self, from: data)
print("decodedData is \(decodedData)")
}
catch {
print("error on decoding JSON")
}
}
}
这个函数的输入是在一个名为 APIHandler
的结构中给出的struct APIHandler {
static let shared = APIHandler()
private let jsonUrl = "https://picsum.photos/v2/list"
public func getDataFromURL() {
guard let stringToURL = URL(string: jsonUrl) else { return } // Creating URL FRom string.
let urlSession = URLSession(configuration: .default) // Creating URLSession
let urlSessionDataTask = urlSession.dataTask(with: stringToURL) { data, URLResponse, error in
if error == nil {
guard let unwrappedData = data else { return }
JSONDecodeHandler.shared.jsonDecode(data: unwrappedData)
}
else {
print("Error in getting data from URL")
}
}
urlSessionDataTask.resume() // Resuming the DataTask
}
}
let urlSessionDataTask = urlSession.dataTask的completionBlock返回一个名为data的数据类型。这个 data 是 JSONDecodeHandler 结构的函数 jsonDecode(data: ) 的输入参数。
最后,结构 APIHAndler 的函数 getDataFromURL() 在我的 viewController 的 viewDidLoad 中被调用,如下所示。
override func viewDidLoad() {
APIHandler.shared.getDataFromURL()
}
通过执行这些步骤,我在终端上看到的是 “解码 JSON 时出错”,我在 JSONDecodeHandler 结构中编写了它以捕获错误。所以基本上我无法解码 JSON 数据。我在这里想念什么? 谢谢
【问题讨论】:
-
用
error替换无意义的文字字符串"Error in getting data from URL"以获得非常具有描述性的真实错误。并将 JSON 中的键与结构中的属性名称进行比较。他们必须匹配,但他们不匹配。您可以将表示 URL 的字符串直接解码为URL -
什么是dataURL?我在你的回复中没有找到这个键。
-
一旦删除 DataURL 并运行它会给你作者的应用程序。
-
@vadian 谢谢!我错过了那个。打印出一个字符串现在没有意义,但目前只是测试。肯定会处理该错误。谢谢
-
即使出于测试目的打印 总是 报告错误。 DecodingErrors 立即发现问题