Swift: кодируемая структура всегда ноль - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть следующий 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, и она работает нормально, но в моем приложении всегда ноль, я что-то здесь упускаю?

Любая помощь будет высоко ценится

1 Ответ

1 голос
/ 11 апреля 2020

Проблема в том, что вы исключили message и data из вашего 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 не соответствует стандартным соглашениям об именах классов, начинающимся с upper регистр букв, и его слишком легко спутать с существующим типом Data). Я не знаю, правильное ли имя Bid, поэтому используйте то, что считаете нужным, но, надеюсь, это иллюстрирует идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...