Swift:可编码结构始终为零

Swift : Codable Struct Always Nil

我有以下JSON响应

{
    "status_code": 1000,
    "data": {
        "user_id": 1000,
        "bid": "E5PPD5E3",
        "province": 0,
        "location": "123,123"
    },
    "message": "Verified"
}

这是我的结构

struct Basicresponse : Codable{

    var statusCode : Int!
    var message : String?
    var data : data?

    enum CodingKeys: String, CodingKey {

        case statusCode = "status_code"

    }

}

struct data : Codable{

      var province : Int
      var userID : Int
      var location : String
      var bid : String

      enum CodingKeys: String, CodingKey {

            case province, location , bid
            case userID = "user_id"

          }
  }

 do {


  let jsonData = try JSONDecoder().decode(Basicresponse.self, from: data!)

         if(jsonData.statusCode == 1000){

                print(jsonData)
         }else{
                 self.alert.show(target: self.view, message: jsonData.message!)
          }


            }
 catch let jsonerr {
          print("error serrializing error",jsonerr)
 }

但是结果如下,

Basicresponse(statusCode: Optional(2000), message: nil, data: nil)

我不知道为什么数据和消息总是零?!我用 Post man 尝试了终点并且它工作正常但在我的应用程序中它总是零,我在这里遗漏了什么吗?

任何帮助将不胜感激

问题是您从 CodingKeys 中排除了 messagedata。但是你可以这样添加它们:

struct Basicresponse: Codable {
    var statusCode : Int!
    var message : String?
    var data : data?

    enum CodingKeys: String, CodingKey {
        case statusCode = "status_code"
        case message, data
    }
}

另一种选择是根本不提供 CodingKeys 并告诉您的解码器为您进行蛇形转换。

let data = """
{
    "status_code": 1000,
    "data": {
        "user_id": 1000,
        "bid": "E5PPD5E3",
        "province": 0,
        "location": "123,123"
    },
    "message": "Verified"
}
""".data(using: .utf8)!

struct BasicResponse: Codable {
    var statusCode: Int
    var message: String?
    var data: Bid?
}

struct Bid: Codable {
    var province: Int
    var userId: Int
    var location: String
    var bid: String
}

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let jsonData = try decoder.decode(BasicResponse.self, from: data)

    if jsonData.statusCode == 1000 {
        print(jsonData)
    } else {
        print(jsonData.message ?? "No message")
    }
} catch let jsonError {
    print("error serializing error", jsonError)
}

希望您不介意,但我已将您的 data 类型重命名为 Bid(因为 data 不符合标准 class以大写字母开头的命名约定很容易与现有的 Data 类型混淆)。我不知道 Bid 是不是正确的名称,所以请使用您认为合适的任何名称,但希望它能说明这个想法。