【问题标题】:SWIFT: Trying to decode JSON ,it returns nilSWIFT:尝试解码 JSON,它返回 nil
【发布时间】:2020-09-01 11:10:33
【问题描述】:

当我尝试调用 .decode() 来解码结构时,它返回 nil。有人可以帮帮我吗?

我的应用从 JSON 数据返回空值,来自这行代码:

   let newPosData = try JSONDecoder().decode(NewPosDataBase.self, from: responseData)

这里是完整的代码:

func getNewLFNREXT(invnr: String, completionHandler: @escaping (String, Bool, NewPosDataBase?) -> Void) {
        let headers: HTTPHeaders = [
            .authorization(username: UserCredentials.shared.username, password: UserCredentials.shared.password),
            .accept("application/json")
        ]
        
        let url:String = Config.middleware + Config.url + "/mobile/lfnrext?invnr=\(invnr)"
        AF.request(url, method: .get, parameters: [:], headers: headers).responseJSON { response in
            if response.response?.statusCode == 200 {
                
                do {
                    guard let responseData = response.data else {
                        completionHandler(errorMessage, false, nil )
                        return
                    }
                    
                    let newPosData = try JSONDecoder().decode(NewPosDataBase.self, from: responseData)
                    
                    print( newPosData.newPosData?.newLfnrext)
                    completionHandler("", true, newPosData)
                    
                } catch {
                    completionHandler(errorMessage, false , nil )
                }
                
            }else {
                let message = self.getErrorMessageFrom(data: response.data, defaultErrorMessage: errorKeineDaten)
                completionHandler(message, false, nil)
            }
        }
        
    }

【问题讨论】:

  • 您可能有错误。在 catch 块中添加print(error)。
  • @pawello2222 根本不进入catch块,返回成功但是nil
  • 您的模型中到处都有可选变量。这样你就不会有任何错误。尝试删除它们。
  • 您需要edit您的问题以包含您收到并尝试解码的json响应。
  • 你自己解析 JSON 的时候为什么还要使用responseJSON?理想情况下,停止使用 Alamofire 框架。它并没有真正带来任何有用的东西。

标签: json swift codable


【解决方案1】:

如果键名与Codable类型的属性名不同,则需要添加enum CodingKeys。

所以,你的模型应该是这样的,

class NewPosDataBase: Codable {
    enum CodingKeys: String, CodingKey {
        case newPosData = "NEW_POS_DATA"
    }
    //rest of the code...
}

class NewPosData: Codable {
    enum CodingKeys: String, CodingKey {
        case newLfnrext = "NEW_LFNREXT"
        case aktuellerZahler = "AKTUELLER_ZAHLER"
        case gpsStd = "GPS_STD"
    }
    //rest of the code...
}

注意:无需在模型中提供任何init 实现,除非您出于任何特定目的需要它们。

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多