Swift — ожидал декодирования массива , но вместо этого нашел словарь.”, underlyingError: nil

#swift #xcode #swift5 #jsondecoder

#swift #xcode #swift5 #jsondecoder

Вопрос:

Я пытаюсь декодировать некоторый json для своего приложения, и я обычно это делаю.

Моя структура;

 struct RequestTypes: Codable {
      let MerchRequestTypeID: Int?
      let TypeName: String?
      let LayoutID: Int?

   private enum CodingKeys: Int, CodingKey {
       case MerchRequestTypeID
       case TypeName
       case LayoutID
       }
}
  

И декодирование;

 func downloadRequestTypesJson(){
    guard let gitUrl = URL(string: "URL") else { return }
    URLSession.shared.dataTask(with: gitUrl) { (data, response
        , error) in
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let RequestData = try decoder.decode(Array<RequestTypes>.self, from: data)
            DispatchQueue.main.sync {
                print(RequestData[0].MerchRequestTypeID)
                print(RequestData[1].MerchRequestTypeID)
                print(RequestData[2].MerchRequestTypeID)
            }
        } catch let err {
            print("Err", err)
        }
        }.resume()
}
  

Это отлично работает для json ниже;

 [
   {
     "MerchRequestTypeID": 1,
     "TypeName": "Stok",
     "LayoutID": 1
   },
   {
     "MerchRequestTypeID": 2,
     "TypeName": "Stand",
     "LayoutID": 2
   },
   {
     "MerchRequestTypeID": 3,
     "TypeName": "Eğitim",
     "LayoutID": 2
   }
]
  

Но теперь мне нужно декодировать этот json, и я ожидаю, что декодирую массив, но вместо этого нашел словарь.ошибка;

 {
  "RequestTypes": [
   {
     "MerchRequestTypeID": 1,
     "TypeName": "Stock",
     "LayoutID": 1
   },
   {
     "MerchRequestTypeID": 2,
     "TypeName": "Stand",
     "LayoutID": 2
   },
   {
     "MerchRequestTypeID": 3,
     "TypeName": "Education",
     "LayoutID": 2
   }
  ]
}
  

Не удалось найти правильный способ сделать это. Любая помощь приветствуется.

Редактировать: я новичок в Swift. Я хочу знать, как декодировать второй json и как получить доступ к его элементам.

Комментарии:

1. let RequestData = try decoder.decode([String: [RequestTypes]].self, from: data)

2. Вы видите, что есть новый ключ «RequestTypes», где вы его декодируете?

3. В чем вопрос? Второй JSON отличается от первого JSON, и это действительно, очевидно, словарь, а не массив, подобный первому. Сообщение об ошибке и JSON расскажут вам все, что нужно знать.

Ответ №1:

Это потому, что вы пытаетесь декодировать объект JSON со свойством «RequestTypes», а не массив. Одним из решений является создание новой структуры для этой структуры данных и использование ее для декодирования вашего JSON:

 struct RequestTypesContainer: Codable {
    let RequestTypes : [RequestTypes]

    private enum CodingKeys: String, CodingKey {
       case RequestTypes
    }
}
  

И затем:

 let RequestData = try decoder.decode(RequestTypesContainer.self, from: data)
  

Комментарии:

1. Прежде всего, спасибо за помощь. Для доступа к его элементам я использую requestData . RequestTypes[0] . Имя типа!