я пытаюсь разобрать json с swift 4, подскажите пожалуйста что в этом плохого? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь проанализировать JSON, используя следующий метод, но XCode выдает ошибку, в которой я объявил «данные».

Я новичок, я не понимаю, что не так. Пожалуйста, помогите мне.

import UIKit

struct Contacts: Decodable {

    let id: Int
    let name: String
    let email: String

}

class ViewController: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        let urlString = "https://api.androidhive.info/contacts/"
        guard let url = URL(string: urlString) else {return}

        URLSession.shared.dataTask(with: url) { (data, response, error) in
        }

        guard let data = data  else {return}
        //let datastring = String(data: data, encoding: .utf8)

        do
        {
            let contact = try JSONDecoder().decode([Contacts].self, from: data)
            print(contact.name)

        } catch let jsonErr {
            print("Error deserializing json:", jsonErr)
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Пожалуйста, попробуйте это работает для меня.

func getContactListsApiCalling() {

     var request = URLRequest(url: URL(string: "https://api.androidhive.info/contacts/")!)

    request.httpMethod = "GET"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in

        do {
            if let Data = data {

                let responseJSON = try JSONSerialization.jsonObject(with: Data) as? Dictionary<String, AnyObject> ?? [:]

                if let contacts = responseJSON["contacts"] as? [[String :AnyObject]] {

                    for contact in contacts {


                        let id  = contact["id"] as? String ?? ""
                        let name  = contact["name"] as? String ?? ""
                        let email   = contact["email"] as? String ?? ""
                        let address  = contact["address"] as? String ?? ""
                        let gender    = contact["gender"] as? String ?? ""

                        print(id,name,email,address,gender)


                    }


                }
            }
        } catch {

            print("error")
        }
    })
    task.resume()
}

}

0 голосов
/ 19 ноября 2018
//
//  ViewController.swift
//  PostMethodTest
//
//  Created by HABIB UR REHMAN on 12/11/2018.
//  Copyright © 2018 HABIB UR REHMAN. All rights reserved.
//

import UIKit
class ViewController: UIViewController {

  struct Resturant: Decodable {
        var name: String
        var deliveryCharges: String
        var email: String

        init(_ dictionary: [String: Any]) {
            self.name = dictionary["name"] as? String ?? ""
            self.deliveryCharges = dictionary["deliveryCharges"] as? String ?? ""
            self.email = dictionary["email"] as? String ?? ""

        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()


        guard let url = URL(string: "your Link Here ") else { return }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"


        let task = URLSession.shared.dataTask(with: request)  {(data, response, error) in

            guard let dataResponse = data,
                error == nil else {
                    print(error?.localizedDescription ?? "Response Error")
                    return }
            do{
                //here dataResponse received from a network request
                let jsonResponse = try JSONSerialization.jsonObject(with:
                    dataResponse, options: [])
                print(jsonResponse) //Response result
            } catch let parsingError {
                print("Error", parsingError)
            }
        }
        task.resume()

        }


}
0 голосов
/ 08 ноября 2018

Три основные проблемы.

  1. Вы игнорируете корневой объект, представляющий собой словарь, содержащий массив contacts.
  2. Значение ключа id равно String, а не Int.
    Жесткое правило: все в двойных кавычках: String даже "12" и "false"
  3. Вы должны возобновить задачу и поместить код для анализа JSON в обработчик завершения.

struct Root : Decodable {

    let contacts : [Contact]
}

struct Contact : Decodable { // It's recommended to name this kind of struct in singular form

    let id, name, email: String
}

...

override func viewDidLoad()
{
    super.viewDidLoad()

    let urlString = "https://api.androidhive.info/contacts/"
    guard let url = URL(string: urlString) else {return}

    URLSession.shared.dataTask(with: url) { (data, response, error) in
       if let error = error { print(error); return }

       do {
          let result = try JSONDecoder().decode(Root.self, from: data!)
          let contacts = result.contacts
          for contact in contacts {
              print(contact.name)
          }

       } catch {
           print("Error deserializing json:", error)
       }

    }.resume()
}
...