Доступ к вложенным данным в Swift - PullRequest
0 голосов
/ 19 марта 2019

Я обращаюсь к API и декодирую ответ json в объект User, но я пытаюсь изменить структуру JSON API. Если я возвращаю базовый объект JSON, используя этот код

let httpURL = "https://dev.test/api/user"

var request = URLRequest(url: url)

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

            guard let data = data else {return}

            do {
                let user = try JSONDecoder().decode(User.self, from: data)

                DispatchQueue.main.async {
                    print(user.email)
                }
            } catch let jsonErr {
                print(jsonErr)
            }
        }
        task.resume()

и следующий JSON

{
    "id": 2,
    "email": "test@example.com",
}

Это работает нормально, но я хочу изменить API, чтобы он возвращал набор вложенных объектов. Например

{
  "data": {
    "user": {
      "id": 2,
      "email": "test@example.com"
    },
    "notifications": [
      {
        "id": "123",
        "notifiable_type": "App\\User"
      }
    ]
  }
}

Как я могу декодировать пользователя? Я пробовал несколько вариантов этого let user = try JSONDecoder().decode(User.self, from: data.data.user) и let user = try JSONDecoder().decode(User.self, from: data["data"]["user"])

бт

1 Ответ

2 голосов
/ 19 марта 2019

Вы можете попробовать

struct Root: Codable {
    let data: DataClass
}

struct DataClass: Codable {
    let user: User
    let notifications: [Notification]
}

struct Notification: Codable {
    let id, notifiableType: String

    enum CodingKeys: String, CodingKey {
        case id
        case notifiableType = "notifiable_type"
    }
}

struct User: Codable {
    let id: Int
    let email: String
}

let user = try JSONDecoder().decode(Root.self, from:data)

OR

do {

    let con = try JSONSerialization.jsonObject(with:data, options: [:]) as! [String:Any]
    let data = con["data"] as! [String:Any]
    let user = data["user"] as! [String:Any]
    let finData = try JSONSerialization.data(withJSONObject:user, options: [:])
    let userCon = try JSONDecoder().decode(User.self, from:finData) 
    print(userCon)

}
catch {

    print(error)
}
...