#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] . Имя типа!