Как разобрать JSON используя Codable в Swift? - PullRequest
0 голосов
/ 25 февраля 2020

Я могу проанализировать JSON с помощью JSONSerialization , но не могу выполнить синтаксический анализ с Кодируемый .

json выглядит так:

[
{
    "id": 1,
    "name": "Leanne Graham",
    "username": "Bret",
    "email": "Sincere@april.biz",
  }

Пожалуйста, помогите мне с кодом.

возможность анализа с помощью JSONSerialization : поступающие данные

Невозможно выполнить парсинг JSON с кодируемым: данные не приходят

struct jsonDataModel: Codable{

var name: String
var userName: String
var email: String

init(name: String, username: String, email: String){
    self.name = name
    self.userName = username
    self.email = email
}
}
class WebviewViewController: UIViewController, WKNavigationDelegate {

@IBOutlet weak var testWebView: WKWebView!


//var itemsArray = [jsonDataModel]()


override func viewDidLoad() {
    super.viewDidLoad()
    serviceCall()
    }

   func serviceCall()
    {

        let jsonString = "https://jsonplaceholder.typicode.com/users"

        let jsonData = jsonString.data(using: .utf8)!

            do {
               let jsonDecoder = JSONDecoder()
               let user = try jsonDecoder.decode(jsonDataModel.self, from: jsonData)
                print("all data \(user)")
                print("Hello \(user.name), \(user.userName), \(user.email) ")
            } catch {
                print("Unexpected error: \(error).")
            }
    }
    }

Пожалуйста, помогите мне разобрать json с кодируемым.

Ответы [ 2 ]

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

Прежде всего, если вы используете URL, то для получения data вам необходимо использовать сетевой API . URLSession - это iOS предоставляемый API для выполнения сетевых операций, таких как загрузка / выгрузка.

Так что просто использование Codable не имеет никакого смысла , Сначала вам нужно иметь data, чтобы разобрать его с Codable.

Вот модель,

struct Model: Codable {
    let id: Int
    let name, username, email: String
}

И вы можете использовать ее в своем controller's viewDidLoad() метод,

if let url = URL(string: "https://jsonplaceholder.typicode.com/users") {
    URLSession.shared.dataTask(with: url) { (data, urlResponse, error) in
        if let data = data {
            do {
                let response = try JSONDecoder().decode([Model].self, from: data)
                print(response.map({ $0.name })) //prints all the names
            } catch {
                print(error)
            }
        }
    }.resume()
}
1 голос
/ 25 февраля 2020

Попробуйте этот пример.

import UIKit
import Foundation

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "https://jsonplaceholder.typicode.com/users")!
        let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
            guard let data = data else { return }
            do{
                let jsonDataModels = try JSONDecoder().decode([JSONDataModel].self, from: data)
                print(String(data: data, encoding: .utf8)!)
                print("jsonDataModels: \(jsonDataModels)")
            }catch{}
        }
        task.resume()

    }
}


struct JSONDataModel: Codable {
    let id: Int
    let name, username, email: String
    let address: Address
    let phone, website: String
    let company: Company
}


struct Address: Codable {
    let street, suite, city, zipcode: String
    let geo: Geo
}


struct Geo: Codable {
    let lat, lng: String
}


struct Company: Codable {
    let name, catchPhrase, bs: String
}
...