Как получить словарь из массива в Swift 4.2 - PullRequest
0 голосов
/ 30 октября 2018

Я видел несколько похожих вопросов, но ни один из них не соответствует моему варианту использования.

У меня есть файл json, структурированный следующим образом:

{
    "Trains": [{
        "Car": "8",
        "Destination": "Glenmont",
        "DestinationCode": "B11",
        "DestinationName": "Glenmont",
        "Group": "1",
        "Line": "RD",
        "LocationCode": "A06",
        "LocationName": "Van Ness-UDC",
        "Min": "3"
    }, {
        "Car": "6",
        "Destination": "Shady Gr",
        "DestinationCode": "A15",
        "DestinationName": "Shady Grove",
        "Group": "2",
        "Line": "RD",
        "LocationCode": "A06",
        "LocationName": "Van Ness-UDC",
        "Min": "3"

    }]
}

Я пытаюсь получить словари для каждого поезда. Я пробовал это (среди других усилий), но я не могу обдумать это. Поэтому я прошу о помощи:

jsonArray = [try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers)] as! [String]

            for train in jsonArray {
                print(train["name"])
            }

Это не компилируется.

Мой jsonArray настроен как:

 var jsonArray = [Any]()

1 Ответ

0 голосов
/ 01 ноября 2018

Я надеюсь, что этот ответ будет соответствовать вашему случаю, проверьте ниже, Не смущайтесь, я использовал ваш ответ JSON в файле.

if let path = Bundle.main.path(forResource: "file", ofType: "json") {
        do {
            let data1 = try Data(contentsOf: URL(fileURLWithPath: path), options: [])

            let jsonDic = try JSONSerialization.jsonObject(with: data1, options: .mutableContainers) as? [String:Any]
            guard let dic = jsonDic else { return}
            if let dict = dic["Trains"] as? [[String:Any]]{
                print(dict)
            }
        } catch {
            print(error as NSError)
        }

}

Если вы хотите использовать декодер, используйте это.

struct Result: Decodable {
     let Trains:[transaction]
}
struct transaction: Decodable {
    let Car:String
    let Destination:String
    let DestinationCode:String
}
var result = [Result]()

 if let path = Bundle.main.path(forResource: "file", ofType: "json") {
         do {
            let data1 = try Data(contentsOf: URL(fileURLWithPath: path), options: [])
            let decoder = JSONDecoder()
            result = [try decoder.decode(Result.self, from: data1)]
             print(result)
         } catch {
            print(error)
        }
    }

Не стесняйтесь говорить, что в моем кодировании есть какая-то ошибка.

...