如何在Swift中将嵌套的json解码为带有数组的自定义类?

如何在Swift中将嵌套的json解码为带有数组的自定义类?,json,swift,nested,alamofire,decodable,Json,Swift,Nested,Alamofire,Decodable,当我试图将一个嵌套的json响应解析到一个自定义的可解码响应类时,我得到了nil 自定义响应类: 用于解析的Json响应, 阿拉莫菲尔呼叫, 现在,let users=try JSONDecoder().decode(ResponseRoot.self,from:response.data!)不会创建任何异常,但用户为零。您创建的结构(在我看来)过于复杂。它们可以是: class User: Codable { var name: String var email: Strin

当我试图将一个嵌套的json响应解析到一个自定义的可解码响应类时,我得到了
nil

自定义响应类: 用于解析的Json响应, 阿拉莫菲尔呼叫, 现在,
let users=try JSONDecoder().decode(ResponseRoot.self,from:response.data!)
不会创建任何异常,但
用户
为零。

您创建的结构(在我看来)过于复杂。它们可以是:

class User: Codable {

    var name: String
    var email: String
    var token: String
}

class ResponseData: Codable {

    let body: [User]?
}

class ResponseRoot: Codable {
    let data : ResponseData
}
然后只需在try-catch块中调用
JSONDecoder().decode(ResponseRoot.self,from:data)

您创建的结构(在我看来)过于复杂。它们可以是:

class User: Codable {

    var name: String
    var email: String
    var token: String
}

class ResponseData: Codable {

    let body: [User]?
}

class ResponseRoot: Codable {
    let data : ResponseData
}


然后只需调用try-catch块内部的
JSONDecoder().decode(ResponseRoot.self,from:data)

状态码400是服务器错误,与解码部分无关。切勿打印
解码错误的
本地化描述
。您丢弃了全面的错误消息。在这种情况下,不是HTTP请求的请求错误吗?失败?API调用失败,因此它不执行解码行我正在获取的有效数据response@aiwiguna&@vadian,我更新了帖子。错误来自上一个日志。对不起,误会了。但是现在我得到了
nil
。看起来你可以删除一半的代码。实际上并不需要编码键,因为变量名与键相同。结构内部也不需要初始值设定项。您所要做的就是调用JSONDecoder.decode(ResponseRoot,from:data),它应该可以工作。状态码400是一个服务器错误,与解码部分无关。切勿打印
解码错误的
本地化描述
。您丢弃了全面的错误消息。在这种情况下,不是HTTP请求的请求错误吗?失败?API调用失败,因此它不执行解码行我正在获取的有效数据response@aiwiguna&@vadian,我更新了帖子。错误来自上一个日志。对不起,误会了。但是现在我得到了
nil
。看起来你可以删除一半的代码。实际上并不需要编码键,因为变量名与键相同。结构内部也不需要初始值设定项。你所要做的就是调用JSONDecoder.decode(ResponseRoot,from:data),它应该可以工作。哇。谢谢。它在try中使用了
let users=try JSONDecoder().decode(ResponseRoot.self,from:response.data!)
。但是,如果我的键和变量名称不同,我的实现有什么问题吗?例如,如果您有一个名为usrid的JSON键,它代表用户id,但是如果你想把一个键解码成一个名为userID的变量,你可以使用这样的编码键:
enum codingkeys:String,CodingKey{case userID=“usrid”}
是的,我知道。我想问的是,为什么我以前的代码在我做得很好的情况下没有正确解析,尽管工作过度。不太确定,可能是因为每个单独结构中的初始值设定项,或者所有变量都是可选的。不太确定,对不起。你可以把这两个东西一个一个的拿走,看看它什么时候开始工作?哇。谢谢。它在try中使用了
let users=try JSONDecoder().decode(ResponseRoot.self,from:response.data!)
。但是,如果我的键和变量名称不同,我的实现有什么问题吗?例如,如果您有一个名为usrid的JSON键,它代表用户id,但是如果你想把一个键解码成一个名为userID的变量,你可以使用这样的编码键:
enum codingkeys:String,CodingKey{case userID=“usrid”}
是的,我知道。我想问的是,为什么我以前的代码在我做得很好的情况下没有正确解析,尽管工作过度。不太确定,可能是因为每个单独结构中的初始值设定项,或者所有变量都是可选的。不太确定,对不起。你可以把这两个东西一个一个地移除,看看它什么时候开始工作?
Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.queryString, headers: nil)
         .validate()
         .responseJSON { response in

            switch (response.result) {

                case .success( _):

                do {
                    let users = try JSONDecoder().decode(ResponseRoot.self, from: response.data!) // getting users = nil
                    completion((users.data?.body!)!)

                } catch let error as NSError {
                    print("Failed to load: \(error.localizedDescription)")
                    completion([])
                }

                 case .failure(let error):
                    print("Request error: \(error.localizedDescription)")
                    completion([])
             }
class User: Codable {

    var name: String
    var email: String
    var token: String
}

class ResponseData: Codable {

    let body: [User]?
}

class ResponseRoot: Codable {
    let data : ResponseData
}