如何将json字符串传递给对象?
我的问题是下一个,我有一个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 }
{
"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)
}
}