【问题标题】:how can I pass a json string to object?如何将 json 字符串传递给对象?
【发布时间】:2019-11-16 11:18:02
【问题描述】:

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

【问题讨论】:

    标签: json swift dictionary object struct


    【解决方案1】:

    这应该是你的 Person 结构:

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

    }

    Person访问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)
       }
    }
    

    【讨论】:

      【解决方案2】:

      首先,您需要为start_screen 添加一个变量到person

      var start_screen: start_screen
      

      那么你需要start_screenDecodable

      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)
      

      【讨论】:

        猜你喜欢
        • 2018-08-25
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多