Передача результата JSON в модель структуры

Я получаю результат от API, я могу повторить результат. Насколько я понимаю, я могу сразу передать значение в модель.

Статья Apple Developer о моделях структур

Моя проблема в том, что я делаю это неправильно и получаю нулевое значение. Возможно, кто-то увидит, где мне нужно измениться. Я использую Swift 4.2

Вот моя модель структуры.

import Foundation

struct ProfileModel {

//MARK: Properties

var name: String
var email: String
var profileURL: String

//MARK: Initialization


}
extension ProfileModel{
  init?(json: [String:AnyObject]) {
    guard
        let name = json["name"] as? String,
        let email = json["email"] as? String,
        let profileURL = json["profileURL"] as? String
        else { return nil }

    self.name = name
    self.email = email
    self.profileURL = profileURL
  }
}

Вот мой код результата из моего urlConnection. Дайте мне знать, если мы хотим увидеть весь файл Swift

//create dataTask using the session object to send data to the server
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

        guard error == nil else {
            return
        }

        guard let data = data else {
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject] {

                self.onSuccess(data: json)

            }
        } catch let error {
            print(error.localizedDescription)
        }
    })
    task.resume()

}


func onSuccess(data: [String:AnyObject]){
  print("onSuccess")

  let myProfile = ProfileModel(json: data)
  //myProfile is nil while unwrapping
  let title: String = myProfile!.name
  print(title)
}

Я мог бы просто перебирать строки, так как я могу печатать «данные». Я просто подумал, что было бы чище поместить все в ProfileModel и управлять этим объектом как целым.

Этот json мой более простой, поэтому я использовал его для этого вопроса. Я также не могу вспомнить, но мне пришлось использовать «[String: AnyObject]», чтобы правильно получить json. Это было получено непосредственно из моего терминала, это были данные, переданные в моем JsonResponse. Вместо этого выходной json из Xcode имеет [] снаружи.

{
'detail': 'VALID', 
‘name’: ‘Carson, 
'email': ‘[email protected]', 
'pic_url': None
}

Обновлено:

Итак, моя проблема решена, и в конечном итоге переход на Codable стал ключевым моментом. Вот мой фиксированный код для тех, кому может понадобиться рабочее решение.

URLSession.shared.dataTask(with: request as URLRequest) { (data, response
        , error) in
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let gitData = try decoder.decode(ProfileModel.self, from: data)
            print(gitData.name)
            self.onSuccess(data: gitData)

        } catch let err {
            print("Err", err)
        }
        }.resume()

}

func onSuccess(data: ProfileModel){
  print("onSuccess")

  print(data.email)

}

Моя кодируемая структура — немного упрощенная

import Foundation

struct ProfileModel: Codable { пусть деталь, имя, электронная почта: String

private enum CodingKeys: String, CodingKey {
    case detail, email
    case name = "firstname"
    //case picUrl = "pic_url"
}

}

Ваша инициализация не удалась. Ну не получается.

matt 21.03.2019 16:51

Вместо чтобы увидеть весь файл swift было бы полезнее увидеть JSON. И упомянутая статья Apple не предлагает ни AnyObject, ни mutableContainers. Кстати статья все равно устарела в пользу протокола Codable

vadian 21.03.2019 16:54
init?(json:): Неудачно. Внутри есть guard condition1, condition2, condition 3 else { return nil }. Возможно, вы захотите проверить, какое из условий не выполняется и почему.
Larme 21.03.2019 16:57

Добавлен мой json, не работает ли моя инициализация, если хотя бы один не работает? Я только что исправил орфографическую ошибку, так что я запущу это. Редактировать: я исправил все свое правописание, чтобы выровнять, так что все должно быть в порядке. @vadin Я не понимал, что это устарело, я подумал, что это самое актуальное.

C. Skjerdal 21.03.2019 17:08

Это недопустимый JSON. Все строки, но заключенные в двойные кавычки, например. "detail": "VALID". И JSON не соответствует вашей модели, нет ключа profileURL, в этом случае инициализатор не работает.

vadian 21.03.2019 17:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
546
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После того, как был представлен «Codable», я всегда использую его. Вы можете взять свой JSON и проанализировать его в QuickType.io, и вы получите Struct, который подтверждает возможность кодирования.

// To parse the JSON, add this file to your project and do:
//
//   let aPIResponse = try? newJSONDecoder().decode(APIResponse.self, from: jsonData)

import Foundation

struct APIResponse: Codable {
    let detail, name, email, picUrl: String

    enum CodingKeys: String, CodingKey {
        case detail, name, email
        case picUrl = "pic_url"
    }
}

Круто, я не буду голосовать за это правильно (пока), но это огромный шаг для меня. Похоже, что Codable — это то, что нужно для этого.

C. Skjerdal 21.03.2019 17:42

Я отметил это правильно, так как это был большой шаг, я опубликую свой правильный код для всех, кто читает мой пост.

C. Skjerdal 21.03.2019 18:17

Другие вопросы по теме