Передача результата JSON в структурную модель - PullRequest
0 голосов
/ 21 марта 2019

Я получаю результат от 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': ‘carson.skjerdal@somethingelselabs.com', 
'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)

}

My Codable Struct - слегка упрощенный

import Foundation

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

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

}

1 Ответ

1 голос
/ 21 марта 2019

После того, как "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"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...