Ios Swift 4 JSON解码根数组

Ios Swift 4 JSON解码根数组,ios,json,swift4,codable,decodable,Ios,Json,Swift4,Codable,Decodable,我在使用Swift 4解码功能解码JSON响应时遇到问题。 我有一个主结构,它有一个内部结构var hr_employees:[employeen]?=[]. 问题在于“var hr_employees:[employeen]”的JSON映射不正确[…] 我得到了响应状态、访问级别和会话令牌三个根值的正确值 ////////////结构的代码//////////////////////// struct EmployeeData: Codable { var response_stat

我在使用Swift 4解码功能解码JSON响应时遇到问题。 我有一个主结构,它有一个内部结构var hr_employees:[employeen]?=[]. 问题在于“var hr_employees:[employeen]”的JSON映射不正确[…]

我得到了响应状态、访问级别和会话令牌三个根值的正确值

////////////结构的代码////////////////////////

struct EmployeeData: Codable {
     var response_status:Int=0
     var access_level:Int=0
     var session_token:String=""
     var hr_employees: [Employee]? = []
}

private enum CodingKeys: String, CodingKey {
        case response_status="response_status"
        case access_level="access_level"
        case session_token="session_token"
        case hr_employees="hr_employees"
    }

    init() {

    }



init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            response_status = try values.decode(Int.self, forKey: .response_status)
            do{
                session_token = try values.decode(String.self, forKey: .session_token)
            }catch {
                print( "No value associated with key title (\"session_token\").")
            }
            do{
                access_level = try values.decode(Int.self, forKey: .access_level)
            }
            catch {
                print( "No value associated with key access_level ")
            }
        }
  struct Employee: Codable {
        var userId:Int=0
        var nameFirst:String=""
        var nameLast:String=""
        var position:String=""
        var company:String=""
        var supervisor:String=""
        var assistant:String=""
        var phone:String=""
        var email:String=""
        var address:String=""
        var gender:String=""
        var age:Int=0
        var nationality:String=""
        var firstLanguage:String=""
        var inFieldOfView:String = "0"
        var photo:String="user-default"
        var status:String="3"
    }
{
"response_status":1
,"access_level":2
,"hr_employees":[
{
"user_id":4226
,"name_last":"Sampe"
,"name_first":"Frederica"
,"position":"Systems Maint"
,"phone":"123456"
,"email":"omega@demo.mobile"
,"address":"00100 Helsinki 1"
,"age":67
,"company":"Omega Enterprise"
}
,{
"user_id":5656
,"name_last":"Aalto"
,"name_first":"Antero"
,"position":"Programming Methodology and Languages Researcher"
,"supervisor":"Mayo Georgia"
,"phone":"123456"
,"email":"omega@demo.mobile"
,"address":"00100 Finland "
,"age":51
,"company":"Omega Fire Related Equipment"
}
]
}
/////////////////内部结构///////////////////////

struct EmployeeData: Codable {
     var response_status:Int=0
     var access_level:Int=0
     var session_token:String=""
     var hr_employees: [Employee]? = []
}

private enum CodingKeys: String, CodingKey {
        case response_status="response_status"
        case access_level="access_level"
        case session_token="session_token"
        case hr_employees="hr_employees"
    }

    init() {

    }



init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            response_status = try values.decode(Int.self, forKey: .response_status)
            do{
                session_token = try values.decode(String.self, forKey: .session_token)
            }catch {
                print( "No value associated with key title (\"session_token\").")
            }
            do{
                access_level = try values.decode(Int.self, forKey: .access_level)
            }
            catch {
                print( "No value associated with key access_level ")
            }
        }
  struct Employee: Codable {
        var userId:Int=0
        var nameFirst:String=""
        var nameLast:String=""
        var position:String=""
        var company:String=""
        var supervisor:String=""
        var assistant:String=""
        var phone:String=""
        var email:String=""
        var address:String=""
        var gender:String=""
        var age:Int=0
        var nationality:String=""
        var firstLanguage:String=""
        var inFieldOfView:String = "0"
        var photo:String="user-default"
        var status:String="3"
    }
{
"response_status":1
,"access_level":2
,"hr_employees":[
{
"user_id":4226
,"name_last":"Sampe"
,"name_first":"Frederica"
,"position":"Systems Maint"
,"phone":"123456"
,"email":"omega@demo.mobile"
,"address":"00100 Helsinki 1"
,"age":67
,"company":"Omega Enterprise"
}
,{
"user_id":5656
,"name_last":"Aalto"
,"name_first":"Antero"
,"position":"Programming Methodology and Languages Researcher"
,"supervisor":"Mayo Georgia"
,"phone":"123456"
,"email":"omega@demo.mobile"
,"address":"00100 Finland "
,"age":51
,"company":"Omega Fire Related Equipment"
}
]
}
////////////以下是JSON//////////////////////

struct EmployeeData: Codable {
     var response_status:Int=0
     var access_level:Int=0
     var session_token:String=""
     var hr_employees: [Employee]? = []
}

private enum CodingKeys: String, CodingKey {
        case response_status="response_status"
        case access_level="access_level"
        case session_token="session_token"
        case hr_employees="hr_employees"
    }

    init() {

    }



init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            response_status = try values.decode(Int.self, forKey: .response_status)
            do{
                session_token = try values.decode(String.self, forKey: .session_token)
            }catch {
                print( "No value associated with key title (\"session_token\").")
            }
            do{
                access_level = try values.decode(Int.self, forKey: .access_level)
            }
            catch {
                print( "No value associated with key access_level ")
            }
        }
  struct Employee: Codable {
        var userId:Int=0
        var nameFirst:String=""
        var nameLast:String=""
        var position:String=""
        var company:String=""
        var supervisor:String=""
        var assistant:String=""
        var phone:String=""
        var email:String=""
        var address:String=""
        var gender:String=""
        var age:Int=0
        var nationality:String=""
        var firstLanguage:String=""
        var inFieldOfView:String = "0"
        var photo:String="user-default"
        var status:String="3"
    }
{
"response_status":1
,"access_level":2
,"hr_employees":[
{
"user_id":4226
,"name_last":"Sampe"
,"name_first":"Frederica"
,"position":"Systems Maint"
,"phone":"123456"
,"email":"omega@demo.mobile"
,"address":"00100 Helsinki 1"
,"age":67
,"company":"Omega Enterprise"
}
,{
"user_id":5656
,"name_last":"Aalto"
,"name_first":"Antero"
,"position":"Programming Methodology and Languages Researcher"
,"supervisor":"Mayo Georgia"
,"phone":"123456"
,"email":"omega@demo.mobile"
,"address":"00100 Finland "
,"age":51
,"company":"Omega Fire Related Equipment"
}
]
}

一个问题是JSON中的内容与您对Employee的定义不匹配。例如,
nameFirst
不存在,而
name\u first
不存在


另一个原因是,您有一个
init(from:)
的自定义实现,它从不获取
hr\u employees

有很多地方需要改进:

  • 您的
    Struct
    s可以得到改进,以利用
    Codable
    协议的自动化功能
  • 您需要了解为什么要使用
    CodingKeys
    enum
    • 对你来说。。。还有最好放在哪里(提示:在
      Struct
      本身内部)
  • 您需要知道哪些参数需要是可选的以及为什么
    • 当然,这取决于您的json结构
  • 如果参数有一个默认值,那么需要遵循一个完全不同的过程;就像拥有自己的
    init(from:Decoder)
    • 在某种程度上,你必须这样做,但在当前状态下,你并不能真正处理所有的事情

  • 根据给定的JSON示例,您可以简单地执行以下操作。
    但是…请注意,这不是为了提供默认值而设计的。i、 e.如果json中缺少键,例如
    status
    ,则
    Employee
    结构中的参数
    status
    将为
    nil
    ,而不是默认值
    “3”



    检查:

    do {
        let employeeData = try JSONDecoder().decode(EmployeeData.self,
                                                    from: jsonAsData)
        print(employeeData)
    }
    catch {
        /*
         If it comes here then debug, it's most probably nil keys
         meaning you need more optional parameters in your struct
         */
        print(error)
    }
    

    如果您希望在
    结构中使用默认值,并且上面的示例是一个dealbreaker,请检查以下答案: