簡體   English   中英

Swift 可編碼/可使用嵌套 json 陣列解碼

[英]Swift Codable / Decodable with Nested json Array

我是 swift 的新手,我正在嘗試通過嵌套 Json。 到目前為止,我已經嘗試過 JSONSerialization,但沒有成功,但在被建議切換到 Codable 之后,我試了一下,但我一直從解析的 JSON 中得到零。 我到目前為止的代碼:

struct AppData: Codable {
    let paymentMethods: [PaymentMethods]?
}
struct PaymentMethods: Codable {
    let payment_method: String?
}

AF.request(startAppUrl, method: .post, parameters: requestParams , encoding: JSONEncoding.default).responseString{
    response in
    switch response.result {
        case .success(let data):
            let dataStr = data.data(using: .utf8)!
            let parsedResult = try? JSONDecoder().decode( AppData.self, from: dataStr)
            print(parsedResult)

        case .failure(let error):
            print((error.localizedDescription))
    }
}

我的 JSON 數據可以在這里找到: https://startv.co.tz/startvott/engine/jsonsample/ 我正在使用 xcode 11

我將感謝您的幫助,因為它已經堅持了一周。

首先在請求行中將responseString替換為responseData ,這樣可以避免將字符串(返回)轉換為數據的額外步驟。

其次,始終在JSONDecoder行周圍添加一個do - catch塊。 永遠不要忽略try? . 該塊將捕獲這個全面的DecodingError

typeMismatch(Swift.Array, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "paymentMethods", intValue: nil)], debugDescription: "期望解碼 Array 但找到了一個字符串/數據。",底層錯誤: nil) )

該錯誤表明鍵paymentMethods的值不是數組。 這是一個字符串。 查看 JSON 它實際上是一個嵌套的 JSON 字符串,必須在第二級解碼。

struct AppData: Codable {
    let paymentMethods: String
}
struct PaymentMethods: Codable {
    let paymentMethod: String
}

AF.request(startAppUrl, method: .post, parameters: requestParams , encoding: JSONEncoding.default).responseData{
    response in
    switch response.result {
        case .success(let data):
            do {
                let parsedResult = try JSONDecoder().decode( AppData.self, from: data)
                let paymentData = Data(parsedResult.paymentMethods.utf8)
                let secondDecoder = JSONDecoder()
                secondDecoder.keyDecodingStrategy = .convertFromSnakeCase
                let paymentMethods = try secondDecoder.decode([PaymentMethods].self, from: paymentData)
                print(paymentMethods)
            } catch {
                print(error)
            }

        case .failure(let error):
            print((error.localizedDescription))
    }
}

邊注:

URL 不需要 POST 請求和參數。 您可以省略除第一個參數之外的所有參數。

暫無
暫無

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

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