Почему JsonDecoder выдает ошибку при попытке проанализировать URL-адрес почтальона, но работает с другими URL-адресами? - PullRequest
0 голосов
/ 27 февраля 2020

Оба 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()

    }
}

Это ошибка, если я использую URL почтальона

1 Ответ

1 голос
/ 27 февраля 2020

Вставьте URL-адрес Почтальона в браузер и посмотрите на JSON.

. Это не работает, потому что есть другие значения, кроме Course для других ключей, поэтому декодирование словаря [String:Course] завершается неудачно.

Вы должны добавить зонтичную структуру для объекта root

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

    }
}
...