ios - 为什么 JsonDecoder 在尝试解析邮递员网址但处理其他网址时出现错误?
问题描述
两个 URL 都包含 Json 格式的字典。
import UIKit
import Foundation
struct Course : Decodable{
let foo1: String?
let foo2: String?
let fullName : String?
let numFound : Int?
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// let jsonUrl = "https://api.plos.org/search?q=title:DNA" //Working On this Url
let jsonUrl = "https://postman-echo.com/get?foo1=bar1&foo2=bar2"//Not Working On this Url
guard let url = URL(string: jsonUrl) else { return}
URLSession.shared.dataTask(with: url) {(data,response,err) in
guard let data = data
else {return}
do
{
let course = try JSONDecoder().decode([String: Course].self , from: data)
course.forEach { print("\($0.key): \($0.value)")}
}
catch let jerr
{
print(jerr)
}
}.resume()
}
}
解决方案
将 Postman URL 粘贴到浏览器中并查看 JSON。
它不起作用,因为除了Course
其他键之外还有其他值,因此解码[String:Course]
字典失败。
您必须为根对象添加一个伞形结构
struct Root : Decodable {
let args : Course
}
struct Course : Decodable {
let foo1: String?
let foo2: String?
let fullName : String?
let numFound : Int?
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// let jsonUrl = "https://api.plos.org/search?q=title:DNA" //Working On this Url
let jsonUrl = "https://postman-echo.com/get?foo1=bar1&foo2=bar2"//Not Working On this Url
guard let url = URL(string: jsonUrl) else { return}
URLSession.shared.dataTask(with: url) {(data,response,err) in
guard let data = data else {return}
do {
let result = try JSONDecoder().decode(Root.self , from: data)
print(result.args.foo1, result.args.foo2)
} catch {
print(error)
}
}.resume()
}
}
推荐阅读
- r - 结合堆叠和分组图表ggplot2
- java - 如何使用 2 个不同的过滤器输入过滤相同的列表 2 次。(按 SearchView 和标签过滤)
- android - 无法解析项目:RNAdMob
- javascript - 克隆时将数据记录到适当的 html 子元素
- python-3.x - 如何在跟踪每个字符的分数的同时对字符串进行操作?
- html - 如何阻止谷歌抓取我的页面,但仍然让百度去做?
- laravel - 如何使用 bootstrap-vue
- testing - testNG 中的测试套件结果依赖性
- c# - 如何解决这个问题我的以下代码不起作用
- javascript - 返回输入数组的最大元素的函数