Расшифровать словарь со случайным начальным ключом - PullRequest
0 голосов
/ 10 мая 2019

Я получаю и пытаюсь проанализировать файл json, который содержит данные о событиях.Это словарь словарей, организованных таким образом, со случайным идентификатором события в качестве ключа к каждому:

{
    "19374176-122" : 
    {
        "event_title" : "Cool Fun Thing to Do",
        "description" : "Have fun and do something cool",
        "time_start" : "13:00:00",
        "time_end" : "14:00:00"
    },
    "9048-5761634" :
    {
        "event_title" : "Nap Time",
        "description" : "Lay down and go to sleep.",
        "time_start" : "15:00:00",
        "time_end" : "16:00:00"
    }
}

Я создал структуру для события

struct Event: Codable{
    let event_title: String
    let description: String
    let time_start: String
    let time_end: String
}

И попыталсяdecode

do{
    let eventData = try JSONDecoder().decode([Event].self, from: data)    
        DispatchQueue.main.async {
            print(eventData)
            //self.events = eventData
            self.collectionView?.reloadData()
        }
    } catch let jsonError{
        print(jsonError)
}

Но я получаю ошибку, что пытаюсь декодировать массив, но получаю словарь

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

Итак, я попытался создать структуру для Rootjson file

struct Root: Codable {
    let event_number: Event
}

И декодировать это

do{
    let eventData = try JSONDecoder().decode(Root.Event.self, from: data)    
        DispatchQueue.main.async {
            print(eventData)
            //self.events = eventData
            self.collectionView?.reloadData()
        }
    } catch let jsonError{
        print(jsonError)
}

Но так как ключ для этого словаря на самом деле не "event_number", я не могу получить эти данные

keyNotFound(CodingKeys(stringValue: "event_number", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"event_number\", intValue: nil) (\"event_number\").", underlyingError: nil))

Что мне здесь не хватает?Я чувствую, что это должно быть относительно просто, я просто должен что-то упускать из виду.

1 Ответ

1 голос
/ 10 мая 2019

Вам нужно

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let eventData = try decoder.decode([String:Event].self, from: data)   

struct Event: Codable {
   let eventTitle, description, timeStart, timeEnd: String
}

{} означает словарь, а [] означает массив

...