Как я могу передать строку JSON объекту? - PullRequest
0 голосов
/ 06 июля 2019

моя проблема следующая, у меня есть этот json

{
  "nombre" : "userProfile.user.name!",
  "apaterno" : 20,
  "amaterno" : true,
  "email" : 100,
  "start_screen" : {
    "info" : true,
    "title" : false,
    "image" : 20,
    "success_btn" : "hola",
    "close_btn" : true
  }
}

я хочу передать этот json в мою структуру, моя структура:

struct person: Decodable
{
    var email : Int
    var nombre : String
    var apaterno : Int
    var amaterno: Bool

    struct start_screen {
        var title: Bool
        var info: Bool
        var image: Int
        var success_btn: String
        var close_btn: Bool
    }
}

со следующими строкамиЯ достиг, поместил json в мою структуру, но структура start_screen не может получить данные.

let jsonData = json.data(using: .utf8)!
let decoder = JSONDecoder()
let myStruct = try! decoder.decode(person.self, from: jsonData)

когда я получаю доступ к myStruct.email, я получаю 100, все в порядке, но я не могу загрузить данные start_screenкак мне это сделать?

Ответы [ 2 ]

1 голос
/ 06 июля 2019

Сначала вам нужно добавить переменную к person для start_screen.

var start_screen: start_screen

Тогда вам нужно будет сделать start_screen Decodable

struct start_screen: Decodable

Это должно быть минимальное количество изменений, чтобы оно заработало.


Кроме того, возможно, вы захотите сделать ваши типы заглавными. start_screen: start_screen действительно сбивает с толку. Вы также можете сделать имена переменных и типов camelCase и сделать преобразование JSONDecoder в / из snake_case. Это также соглашение об именах в Swift. Это будет выглядеть так

struct Person: Decodable {
    var email: Int
    var nombre: String
    var apaterno: Int
    var amaterno: Bool
    var startScreen: StartScreen

    struct StartScreen: Decodable {
        var title: Bool
        var info: Bool
        var image: Int
        var successBtn: String
        var closeBtn: Bool
    }
}

let jsonData = json.data(using: .utf8)!
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let person = try! decoder.decode(Person.self, from: jsonData)
print(person)
0 голосов
/ 07 июля 2019

Это должен быть ваш Персона struct:

struct Person: Decodable {
var email : Int?
var nombre : String?
var apaterno : Int?
var amaterno: Bool
var start_screen: Start_screen?

enum CodingKeys: String, CodingKey {

    case email = "email"
    case nombre = "nombre"
    case apaterno = "apaterno"
    case amaterno = "amaterno"
    case start_screen = "amaterno"
}

init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    email = try values.decodeIfPresent(Int.self, forKey: .email)
    nombre = try values.decodeIfPresent(String.self, forKey: .nombre)
    apaterno = try values.decodeIfPresent(Int.self, forKey: .apaterno)
    amaterno = try values.decodeIfPresent(Bool.self, forKey: .apaterno) ?? false
    start_screen = try values.decodeIfPresent(Start_screen.self, forKey: .start_screen)
}

}

Это должен быть ваш Start_screen struct:

struct Start_screen: Decodable {
var title: Bool
var info: Bool
var image: Int?
var success_btn: String?
var close_btn: Bool

enum CodingKeys: String, CodingKey {

    case title = "title"
    case info = "info"
    case image = "image"
    case success_btn = "success_btn"
    case close_btn = "close_btn"
}

init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    title = try values.decodeIfPresent(Bool.self, forKey: .title) ?? false
    info = try values.decodeIfPresent(Bool.self, forKey: .info) ?? false
    image = try values.decodeIfPresent(Int.self, forKey: .image)
    success_btn = try values.decodeIfPresent(String.self, forKey: .success_btn)
    close_btn = try values.decodeIfPresent(Bool.self, forKey: .close_btn) ?? false
}

}

Доступ к start_screen с Персона :

if let jsonData = json.data(using: .utf8) {
   let user = try! JSONDecoder().decode(Person.self, from: jsonData)
   if let title = user.start_screen.title {
      print(title)
   }
}
...