Ой! Спасибо, что поймали это.

кто-нибудь сказать мне, что я делаю не так? Я посмотрел на все вопросы здесь, как здесьКак декодировать вложенную структуру JSON по протоколу Swift Decodable? и я нашел тот, который кажется именно то, что мне нужноSwift 4 Кодируемое декодирование JSON.

{
"success": true,
"message": "got the locations!",
"data": {
    "LocationList": [
        {
            "LocID": 1,
            "LocName": "Downtown"
        },
        {
            "LocID": 2,
            "LocName": "Uptown"
        },
        {
            "LocID": 3,
            "LocName": "Midtown"
        }
     ]
  }
}

struct Location: Codable {
    var data: [LocationList]
}

struct LocationList: Codable {
    var LocID: Int!
    var LocName: String!
}

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let url = URL(string: "/getlocationlist")

    let task = URLSession.shared.dataTask(with: url!) { data, response, error in
        guard error == nil else {
            print(error!)
            return
        }
        guard let data = data else {
            print("Data is empty")
            return
        }

        do {
            let locList = try JSONDecoder().decode(Location.self, from: data)
            print(locList)
        } catch let error {
            print(error)
        }
    }

    task.resume()
}

Я получаю ошибку:

typeMismatch (Swift.Array, Swift.DecodingError.Context (codingPath: [], debugDescription: «Ожидается декодировать массив, но вместо него найден словарь.», underError: nil))

Ответы на вопрос(1)

Решение Вопроса

Проверьте обрисованную в общих чертах структуру вашего текста JSON:

{
    "success": true,
    "message": "got the locations!",
    "data": {
      ...
    }
}

Значение для"data" это объект JSON{...}это не массив. И структура объекта:

{
    "LocationList": [
      ...
    ]
}

Объект имеет одну запись"LocationList": [...] и его значение является массивом[...].

Вам может понадобиться еще одна структура:

struct Location: Codable {
    var data: LocationData
}

struct LocationData: Codable {
    var LocationList: [LocationItem]
}

struct LocationItem: Codable {
    var LocID: Int!
    var LocName: String!
}

Для тестирования...

var jsonText = """
{
    "success": true,
    "message": "got the locations!",
    "data": {
        "LocationList": [
            {
                "LocID": 1,
                "LocName": "Downtown"
            },
            {
                "LocID": 2,
                "LocName": "Uptown"
            },
            {
                "LocID": 3,
                "LocName": "Midtown"
            }
        ]
    }
}
"""

let data = jsonText.data(using: .utf8)!
do {
    let locList = try JSONDecoder().decode(Location.self, from: data)
    print(locList)
} catch let error {
    print(error)
}
 Misha16 сент. 2017 г., 13:30
Ой! Спасибо, что поймали это.

Ваш ответ на вопрос