首页 > 解决方案 > 如何将 json 字符串传递给对象?

问题描述

我的问题是下一个,我有一个这个 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 数据,我该怎么做?

标签: jsonswiftdictionaryobjectstruct

解决方案


首先,您需要为personfor添加一个变量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)

推荐阅读