JSON解码器类型不匹配错误 [英] JSON Decoder Type Mismatch Error

查看:168
本文介绍了JSON解码器类型不匹配错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用可解码的语法来解析JSON,但出现类似以下错误类型的错误匹配:

I want to parse JSON using decodable, but I get an error type mismatch like:

Swift.DecodingError.Context(codingPath:[],debugDescription:预期用于解码Array,但找到了字典."

Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array but found a dictionary instead."

我的JSON:

{
  "code": 0,
  "data": {
    "_id": "string",
    "title": "string",
    "images": [
      "string"
    ],
    "shortDesc": "string",
    "desc": "string",
    "price": 0,
    "discountPrice": 0,
    "quantity": 0,
    "category": {
      "name": "string",
      "val": "string"
    },
    "brand": {
      "name": "string",
      "val": "string"
    },
    "variants": [
      {
        "name": "string",
        "value": "string",
        "quantity": 0,
        "variantCode": "string"
      }
    ],
    "stockCode": "string",
    "updatedDate": "2018-06-05T14:04:51.226Z",
    "status": true,
    "isDeleted": true,
    "isNew": true,
    "freeCargo": true,
    "createDate": "2018-06-05T14:04:51.226Z",
    "note1": "string",
    "note2": "string",
    "note3": "string",
    "shop": {
      "name": "string",
      "val": "string"
    }
  },
  "error": "string"
}

我的模型:

struct ProductDetail : Decodable {
        let code : Int = 0
        let error : String = ""
        var data : NestedData? = nil
}

嵌套数据:

struct NestedData : Decodable{
    let _id : String = ""
    let title : String = ""
    let images : [String] = []
    let shortDesc : String = ""
    let desc : String = ""
    let price : Int = 0
    let discountPrice : Int = 0
    let quantity : Int = 0
    let updatedDate : String = ""
    let status : Bool = false
    let isDeleted : Bool = false
    let isNew : Bool = false
    let freeCargo : Bool = false
    let createDate : String = ""
    let note1: String = ""
    let note2: String = ""
    let note3: String = ""
    let variants : [variants]? = nil
    let brand : brand? = nil
    let category :category? = nil
    let shop : shop? = nil

}

对象:

struct variants : Decodable{
    let name : String
    let val : String
    let quantity : Int
    let variantCode : String
}

struct brand : Decodable{
    let name : String
    let val : String
}

struct category : Decodable{
    let name : String
    let val : String
}

struct shop : Decodable{
    let name : String
    let val : String
}

我不明白为什么会出错,控制台说是预期的数组,但是找到了字典,但不幸的是我不明白.

I don't understand why I get an error, Console says expected array but dictionary found but I don't understand unfortunately.

推荐答案

好吧,我建议您使用 quicktype

它将帮助您制作模型

我使用它,这是模型

struct ProductDetail: Codable {
    let code: Int?
    let data: DataClass?
    let error: String?
}

struct DataClass: Codable {
    let id, title: String?
    let images: [String]?
    let shortDesc, desc: String?
    let price, discountPrice, quantity: Int?
    let category, brand: Brand?
    let variants: [Variant]?
    let stockCode, updatedDate: String?
    let status, isDeleted, isNew, freeCargo: Bool?
    let createDate, note1, note2, note3: String?
    let shop: Brand?

    enum CodingKeys: String, CodingKey {
        case id = "_id"
        case title, images, shortDesc, desc, price, discountPrice, quantity, category, brand, variants, stockCode, updatedDate, status, isDeleted, isNew, freeCargo, createDate, note1, note2, note3, shop
    }
}

struct Brand: Codable {
    let name, val: String?
}

struct Variant: Codable {
    let name, value: String?
    let quantity: Int?
    let variantCode: String?
}

之后,您可以使用 JSONDecoder

Alamofire.request(urlCourses, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in

        switch response.result {

        case .success:

            guard let data = response.data else { return }

            do {

                let productDetail = try? JSONDecoder().decode(ProductDetail.self, from: jsonData)

            } catch let jsonError {

                print("Error serializing json:", jsonError)
            }

        case .failure(let error):

            print(error)
        }
}

这篇关于JSON解码器类型不匹配错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆