Swift - ожидается декодирование массива <Any>, но вместо него найден словарь - PullRequest
0 голосов
/ 22 октября 2019

У меня есть json как ниже:

object{2}
  status: 1
  result{3}
     cohorts[23]
     categories[158]
     languages[16]

И я Decoder это как ниже:

struct ResultAPIJSON: Decodable {
    private enum RootCodingKeys: String, CodingKey {
        case result
    }

    private enum FeatureCohortsCodingKeys: String, CodingKey {
        case cohorts
    }


    var cohortsPropertiesArray = [CohortsProperties]()


        init(from decoder: Decoder) throws {
            let rootContainerCohorts = try decoder.container(keyedBy: RootCodingKeys.self)
            var featuresContainerCohorts = try rootContainerCohorts.nestedUnkeyedContainer(forKey: .result)
            let AAA = try featuresContainerCohorts.nestedContainer(keyedBy: FeatureCohortsCodingKeys.self)
            let BBB = try AAA.nestedUnkeyedContainer(forKey: .cohorts)
            while BBB.isAtEnd == false {

                let propertiesContainer = try featuresContainerCohorts.nestedContainer(keyedBy: FeatureCohortsCodingKeys.self)
                // Decodes a single quake from the data, and appends it to the array.
                let properties = try propertiesContainer.decode(CohortsProperties.self, forKey: .cohorts)
                cohortsPropertiesArray.append(properties)
            }
        }
}

Но поймите меня, ошибка ниже:

typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))

1 Ответ

0 голосов
/ 27 октября 2019

Если это ваш JSON

object{2}
  status: 1
  result{3}
     cohorts[23]
     categories[158]
     languages[16]

(или, скорее, это:)

{
    "status": 1,
    "result": {
        "cohorts": 23,
        "categories": 158,
        "languages": 16
    }
}

, тогда вам нужно два struct s:

struct object: Decodable {
   let status: Int
   let result: Result
}

struct Result: Decodable {
   let cohorts: Int
   let categories: Int
   let languages: Int
}
...