1

現在、json ディクショナリを迅速に画面に解析しようとしていますが、このシーケンス プロトコル エラーと、文字列/データを取得して Int を予期するタイプの不一致エラーが発生しています。エラーは「タイプ 'ProductResponse' はプロトコル 'Sequence' に準拠していません」であり、

"typeMismatch(Swift.Int, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "code", intValue: nil)], debugDescription: "Int をデコードすることが期待されますが、代わりに文字列/データが見つかりました.", 基本エラー: nil ))」

 struct ProductResponse: Codable {
    let code: String
    let product: Product
    let statusVerbose: String
    let status: Int

    enum CodingKeys: String, CodingKey {
        case code, product
        case statusVerbose = "status_verbose"
        case status
    }
}

struct Product: Codable {
    let code: String
    let productName: String

    enum CodingKeys: String, CodingKey {
        case code
        case productName = "product_name"
    }

}


class ViewController: UIViewController {
    //var products = [Product]()
    let API_URL = "https://carsdata/api/v0/product/5000112630794.json"
    override func viewDidLoad() {
        super.viewDidLoad()
        Alamofire.request(API_URL).responseJSON {
            response in
            let json = response.data
            do
            {
                let decoder = JSONDecoder()
                let productData = try decoder.decode(ProductResponse.self, from: json!)
                for product in productData{  print(product.productName!) } }
            catch
                let err{  print(err) }
        }
    }
}
4

1 に答える 1

-1

問題は、JSON をそのまま解析していないことです。ここに 2 つのオブジェクトがあります。ProductResponseそしてProduct、あなたはそれを1つとして解析しようとしています。productNameは の一部ですProductが、 から取得しようとしていますProductResponse。わかりやすくするために、2 つのエンティティを作成して、これを試すことをお勧めします。

struct ProductResponse: Codable {
    let code: String
    let product: Product
    let statusVerbose: String
    let status: Int

    enum CodingKeys: String, CodingKey {
        case code, product
        case statusVerbose = "status_verbose"
        case status
    }
}

struct Product: Codable {
    let code: String
    let productName: String

    enum CodingKeys: String, CodingKey {
        case code
        case productName = "product_name"
    }
}

ProductResponse.self代わりにデコードしてみてください。

于 2019-02-24T22:07:36.257 に答える