如何将json字符串传递给对象?

如何将json字符串传递给对象?,json,swift,dictionary,object,struct,Json,Swift,Dictionary,Object,Struct,我的问题是下一个,我有一个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

{
  "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\u screen结构无法获取数据

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

当我访问myStruct.email时,我得到100,这没问题,但我无法加载开始屏幕数据,我该怎么做?

首先,您需要为
开始屏幕添加一个变量

var start_screen: start_screen
然后您需要使
start\u屏幕
可解码

struct start_screen: Decodable
这应该是使其工作的最小更改量


此外,您可能希望将类型大写<代码>开始屏幕:开始屏幕看起来很混乱。您还可以使变量和类型名
camelCase
,并让
JSONDecoder
为您转换为/来自
snake\u case
。这也是swift中的命名约定。看起来是这样的

struct-Person:可解码{
电子邮件:Int
var nombre:String
var apaterno:Int
瓦阿马特诺:布尔
var startScreen:startScreen
结构StartScreen:可解码{
var标题:布尔
变量信息:Bool
变量图像:Int
var successBtn:字符串
var closeBtn:Bool
}
}
让jsonData=json.data(使用:.utf8)!
let decoder=JSONDecoder()
decoder.keyDecodingStrategy=.convertFromSnakeCase
让人试试!decoder.decode(Person.self,from:jsonData)
印刷品(人)

这应该是你的结构:

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)
}
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
}
}


这应该是您的开始屏幕结构:

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)
}
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
}
}

个人访问开始屏幕

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)
   }
}