Невозможно разобрать JSON по ссылке - без ошибок, но функция возвращается после попытки доступа к URL - PullRequest
0 голосов
/ 07 мая 2019

Я новичок в Swift и пробую базовый анализ JSON, следуя инструкциям.Я хочу напечатать поле файла JSON, но оно не работает.

Несмотря на то, что ссылка существует, и я использую ту же ссылку, что и в предыдущем уроке, она возвращает, а не переходит к доступу к JSON.

Я понимаю, что "проще"способ сделать это в Swift4 с помощью декодера, но я получил ошибку, когда я сделал это таким образом.

Вот структура, которую я использую:

struct Tester {
        var userId: Int
        var id: Int
        var title: String
        var body: String

        init(json: [String: Any]){
            userId = json["userId"] as? Int ?? -10
            id = json["id"] as? Int ?? -400
            title = json["title"] as? String ?? ""
            body = json["body"] as? String ?? ""
        }
    }

А вот код, которыйпытается получить доступ к записям JSON

 @IBAction func printIDTitle(_ sender: Any) {


        guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts") else { return }

        let session = URLSession.shared

        session.dataTask(with: url) { (data, response, error) in
            if let response = response {
                print(response)
            }
            guard let data = data else { return }




            do {


                print("here 0\n")
                guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] else {
                    print(error)
                    return
                }
                print("here 0.5\n")
                print("here 1\n")
                let d = Tester(json: json)
                print(d.id)
                print(d.title)
                print("here 2\n")
            } catch let error {
                print(error)
            }
            }.resume()






    }

«Здесь 0» - единственная распечатка, которая появляется.В чем может быть моя проблема?

1 Ответ

0 голосов
/ 07 мая 2019

Корень - это массив, поэтому измените

 guard let json = try JSONSerialization.jsonObject(with: data, options:[]) as? [[String: Any]] else {
     print(error)
     return
  }

Или лучше

 let res = try! JSONDecoder().decode([Root].self, from:data)


struct Root: Codable {
    let userId, id: Int
    let title, body: String 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...