【问题标题】:JSON Decoding is printing an error, instead of printing decoded data [closed]JSON解码正在打印错误,而不是打印解码数据[关闭]
【发布时间】:2021-10-14 16:30:01
【问题描述】:

我正在尝试从下面的 JSON Array 中获取 authordownload_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 立即发现问题

标签: json swift xcode parsing


【解决方案1】:

您的struct ImageData 中的名称是dataURL,但在json 中您有download_urlurl。这些名称必须匹配 Swift 才能解码 json。您的 dataURL 字段可能为空。

【讨论】:

  • 谢谢!错过了一个,我的问题已经解决了。欣赏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2014-08-04
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多