簡體   English   中英

如何使用 Alamofire 5 解析數組

[英]How to parse Array with Alamofire 5

我在使用 Alamofire 5 解碼 json 數據時需要幫助。我對這個無法解碼的數組感到困惑....

[
    {
        "Date": "2022-08-08T00:00:00",
        "Day": "Fri",
        "AbsenceCount": 0,
        "AbsenceRequestComments": "Request permitted",
        "Color": "No",
        "IsRequestPermitted": true
    },
    {
        "Date": "2022-09-09T00:00:00",
        "Day": "Sat",
        "AbsenceCount": 0,
        "AbsenceRequestComments": "Request permitted",
        "Color": "No",
        "IsRequestPermitted": true
    },
    {
        "Date": "2022-12-15T00:00:00",
        "Day": "Sun",
        "AbsenceCount": 0,
        "AbsenceRequestComments": "Request permitted",
        "Color": "No",
        "IsRequestPermitted": true
    }
]

我正在從這個 stackoverflow 中嘗試所有內容,但沒有找到對我的案例有幫助的東西。 我還使用 Codable model 嘗試了 responseString、responseData、responseJSON 和 finaly responseDecodableOf。

let request = AF.request(requestURL, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: returnHeader())
    .validate()
    .responseDecodable(of: [CoverCheckForDay].self) { response in
        switch response.result {
        case .success:
            guard let value = response.value else { failure(""); return }
            success(value)
        case .failure(let error):
            failure(error.localizedDescription)
        }
    }

我的 model

struct CoverCheckForDay: Codable {
    let date: String
    let day: String
    let absenceCount: Int
    let absenceRequestComments: String
    let color: String
    let isRequestPermitted: Bool

    enum CodingKeys: String, CodingKey {
        case date = "Date"
        case day = "Day"
        case absenceCount = "AbsenceCount"
        case absenceRequestComments = "AbsenceRequestComments"
        case color = "Color"
        case isRequestPermitted = "IsRequestPermitted"
    }
}

我收到無效類型的錯誤,同樣在 responseString 的情況下,我有一些字符串:“\”。 就是這樣,我將非常感謝您的幫助,謝謝!

編輯:來自alamofire的錯誤

▿ Optional<AFError>
  ▿ some : AFError
    ▿ responseSerializationFailed : 1 element
      ▿ reason : ResponseSerializationFailureReason
        ▿ decodingFailed : 1 element
          ▿ error : DecodingError
            ▿ typeMismatch : 2 elements
              - .0 : Swift.Array<Any>
              ▿ .1 : Context
                - codingPath : 0 elements
                - debugDescription : "Expected to decode Array<Any> but found a string/data instead."
                - underlyingError : nil

我的參數:

▿ 3 elements
  ▿ 0 : 2 elements
    - key : "employeeId"
    - value : 13558
  ▿ 1 : 2 elements
    - key : "dates"
    ▿ value : 3 elements
      ▿ 0 : CoverRequestArray
        ▿ date : Optional<String>
          - some : "01/09/2022"
        ▿ day : Optional<String>
          - some : "Thu"
      ▿ 1 : CoverRequestArray
        ▿ date : Optional<String>
          - some : "02/09/2022"
        ▿ day : Optional<String>
          - some : "Fri"
      ▿ 2 : CoverRequestArray
        ▿ date : Optional<String>
          - some : "03/09/2022"
        ▿ day : Optional<String>
          - some : "Sat"
  ▿ 2 : 2 elements
    - key : "siteId"
    - value : 440

你為什么不嘗試像這樣解碼:

在您的文件中但在您的結構之外添加:

typealias CoverCheck = [CoverCheckForDay]

並像這樣解碼:

AF.request(requestURL, method: .get)
        .response{ response in
            switch response.result {
            case .success(let data):
                let newJSONDecoder = JSONDecoder()
                if let result = try? newJSONDecoder.decode(CoverCheck.self, from: data!){
                   print(result)
                }
            case .failure(let error):
                print(error)
            }
        }

您的 output 是一個空字符串,您的自定義奇數故障值

問題是對success案例的處理是錯誤的。

.success有一個非可選的關聯值,例如.failure ,它是解碼后的 object。

將代碼更改為類似

.responseDecodable(of: [CoverCheckForDay].self) { response in
    switch response.result {
    case .success(let coverCheckArray):
        success(coverCheckArray)

所以伙計們的問題是在服務器端我猜是錯誤的方法。 后端開發人員使用輸入數據主體執行 GET 方法 Web 表示,從 2019 年開始,Apple 違反了使用 GET 發送正文數據。

感謝大家的回答,所以在某些情況下,我沒有先檢查這個是我的失敗。

屏幕來自 postman

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM