如何在 Swift 中使用 Codable 解析 JSON?

How to parse JSON using Codable in Swift?

我可以使用 JSONSerialization 解析 JSON,但无法使用 Codable 解析。

json 看起来像这样:

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

请帮我写代码。

能够使用JSON序列化进行解析:数据即将到来

无法使用 Codable 解析 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).")
            }
    }
    }

请帮我用 codable 解析 json。

试试这个例子。

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
}

首先,如果您使用的是 URL,那么要获得 data,您需要使用 网络 api . URLSessioniOS 提供的 api 来执行类似 download/upload 的网络操作。

因此,仅使用 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({ [=11=].name })) //prints all the names
            } catch {
                print(error)
            }
        }
    }.resume()
}