为什么 JsonDecoder 在尝试解析邮递员 Url 但处理其他网址时出错?

Why JsonDecoder Giving Error while trying to parse postman Url but working on other urls?

两者 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("\([=11=].key): \([=11=].value)")}
            }
            catch let jerr
            {
                print(jerr)
            }
        }.resume()

    }
}

This Is the Error If I am Using Postman Url

将 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()

    }
}