【问题标题】:Swift : Codable Struct Always NilSwift : Codable Struct Always Nil
【发布时间】:2020-04-11 17:28:50
【问题描述】:

我有以下 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 尝试了终点,它工作正常,但在我的应用程序中它总是为零,我在这里遗漏了什么吗?

任何帮助将不胜感激

【问题讨论】:

  • API调用你用什么? Alamofire 或 URLSession
  • 你得到什么错误?

标签: json swift codable decodable


【解决方案1】:

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

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 不符合以大写字母开头的标准类命名约定,而且太容易了与现有的 Data 类型混淆)。我不知道Bid 是否是正确的名称,所以请使用您认为合适的名称,但希望它能说明这个想法。

【讨论】:

  • 谢谢 Rob,正如你所说,我被排除在外,现在所有的数据属性都已修复
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多