首页 > 解决方案 > 为什么 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,这是错误

标签: iosjsonswiftcodabledecodable

解决方案


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

    }
}

推荐阅读