ios - 如何解决在 swift 中使用 Alamofire 从 API 中提取数据时的无效 json 问题?

标签 ios json swift api alamofire

我的代码需要一些帮助。下面的 json 是我从 postman 那里得到的原始响应。

旧格式

{
   "totalCreditedAmount": 2898.3000,
   "periodId": 566,
   "periodDate": "4/26/2019"
}

所以我创建了下面的 API 服务代码。它运行顺利。

API服务

 struct DoctorLatestCreditedAmount {
   typealias getLatestCreditedAmountTaskCompletion = (_ latestCreditedAmount: CurrentRemittance?, _ error: NetworkError?) -> Void

  static func getLatestCreditedAmount(doctorNumber: String, completion: @escaping getLatestCreditedAmountTaskCompletion) {

        guard let latestCreditedAmountURL = URL(string: "\(Endpoint.LatestCreditedAmount.latestCreditedAmount)/\(doctorNumber)") else {
            completion(nil, .invalidURL)
            return
        }

        let sessionManager = Alamofire.SessionManager.default
        sessionManager.session.getAllTasks { (tasks) in
            tasks.forEach({ $0.cancel() })
        }

        Alamofire.request(latestCreditedAmountURL, method: .get, encoding: JSONEncoding.default).responseJSON { (response) in
            guard HelperMethods.reachability(responseResult: response.result) else {
                completion(nil, .noNetwork)
                return
            }

            guard let statusCode = response.response?.statusCode else {
                completion(nil, .noStatusCode)
                return
            }

            switch(statusCode) {
            case 200: guard let jsonData = response.data else {
                completion(nil, .invalidJSON)
                return
                }

                let decoder = JSONDecoder()

            do {
                let currentCreditedAmount = try decoder.decode(CurrentRemittance.self, from: jsonData)
                completion(currentCreditedAmount, nil)
            } catch {
                completion(nil, .invalidJSON)
                }

            case 400: completion(nil, .badRequest)
            case 404: completion(nil, .noRecordFound)
            default:
                print("**UNCAPTURED STATUS CODE FROM (getLatestCreditedAmount)\nSTATUS CODE: \(statusCode)")
                completion(nil, .uncapturedStatusCode)
            }

        }

    }

但是当 json 端对响应进行了一些更改时。 json 格式已更改,现在使用上面的 APIService 我遇到了错误。它说 invalidjson 因为下面是新的 json 格式。

新格式

 {
   "responseMessage": "Request successful",
    "data": {
         "totalCreditedAmount": 2898.3000,
         "periodId": 566,
         "periodDate": "4/26/2019"
   }
}

已编辑:getTotalCreditedAmount

var currentRemittance: CurrentRemittance!

func getTotalCreditedAmount(doctorNumber: String) {
   windlessSetup()
   APIService.DoctorLatestCreditedAmount.getLatestCreditedAmount(doctorNumber: doctorNumber) { (remittanceDetails, error) in
       guard let creditedAmountDetails = remittanceDetails, error == nil else {
           if let networkError = error {
               switch networkError {
               case .noRecordFound:
                   let alertController = UIAlertController(title: “No Record Found”, message: “You don’t have current payment remittance”, preferredStyle: .alert)
                   alertController.addAction(UIAlertAction(title: “OK”, style: .default))
                    self.present(alertController, animated: true, completion: nil)
               case .noNetwork:
                   let alertController = UIAlertController(title: “No Network”, message: “\(networkError.rawValue)“, preferredStyle: .alert)
                   alertController.addAction(UIAlertAction(title: “OK”, style: .default))
                   self.present(alertController, animated: true, completion: nil)
               default:
                   let alertController = UIAlertController(title: “Error”, message: “There is something went wrong. Please try again”, preferredStyle: .alert)
                   alertController.addAction(UIAlertAction(title: “OK”, style: .default))
                   self.present(alertController, animated: true, completion: nil)
               }
           }
           self.creditedView.windless.end()
           self.remittanceView.windless.end()
           return
       }
       self.currentRemittance = creditedAmountDetails
       self.showLatestTotalCreditedAmount()
       self.creditedView.windless.end()
       self.remittanceView.windless.end()
       return
   }

遇到错误 Breakpoint Image

我的问题是,如何更改我的 APIService 代码,使其与我获得的正确的新 json 格式相匹配。自从我习惯于使用相同的“旧”格式以来,我很难过。我真的是 swift 的新手,我真的需要帮助。希望你能给我一些时间。

最佳答案

你需要


// MARK: - Welcome
struct Root: Codable {
    let responseMessage: String
    let data: CurrentRemittance
}

// MARK: - DataClass
struct CurrentRemittance: Codable {
    let totalCreditedAmount: Double
    let periodId: Int
    let periodDate: String 
}

解码

 let res = try decoder.decode(Root.self, from: jsonData) 
 print(res.data)

关于ios - 如何解决在 swift 中使用 Alamofire 从 API 中提取数据时的无效 json 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57263588/

相关文章:

ios - 如何摆脱 UIWebView 上的状态栏背景?

ios - 如何在 Swift 中的特定时间发送本地通知?

javascript - 使用动态数据更新 d3js Datamap

ios - 使用 CMMotionManager swift iOS sdk 滚动球

ios - 打印 C 字符串 (UTF-8) 时的 NSLog() 与 printf()

ios - 使用约束对动态生成的 View 进行动画处理

javascript - 在 jQuery AJAX 后输出中读取 JSON 数据

java - [简单类型,反序列化时重复属性 ''

ios - 如何在swift中递归遍历NSDictionary

ios - 按下主页按钮后 NSTimer 不触发