JSON массив контейнеров без ключей (для быстрого анализа) - PullRequest
1 голос
/ 09 февраля 2020

Как мне разобрать это? Массив безымянный, объекты безымянные? Мне также нужно отсортировать и найти совпадения между событиями, ЕСЛИ у вас, ребята, тоже есть какие-то советы, это будет огромной помощью для меня.

[{"title": "Evening Picnic", "start": "November 10, 2018 6:00 PM", "end": "November 10, 2018 7:00 PM"},
{"title": "Nap Break", "start": "November 8, 2018 12:56 PM", "end": "November 8, 2018 1:30 PM"}, 
{"title": "Football Game", "start": "November 3, 2018 6:14 PM", "end": "November 3, 2018 9:44 PM"}]    

Я новичок в Свифте и мне интересно, как разобраться с этим

1 Ответ

2 голосов
/ 09 февраля 2020

Ваш JSON не требует от вас реализации контейнера без ключа для его анализа образец контейнера без ключа . Что вам нужно, это пользовательские DateFormatter и DateDecodingStrategy. Чтобы отсортировать ваши события, вам необходимо согласовать его с Comparable протоколом

. Это DateFormatter предполагает, что ваша строка даты имеет фиксированный формат даты с местным временем:

extension Formatter {
    static let custom: DateFormatter = {
        let formatter = DateFormatter()
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        formatter.dateFormat = "MMMM d, yyyy h:mm a"
        return formatter
    }()
}

Пользовательский DateDecodingStrategy:

extension JSONDecoder.DateDecodingStrategy {
    static let monthDayYearTime = custom {
        let container = try $0.singleValueContainer()
        let string = try container.decode(String.self)
        guard let date = Formatter.custom.date(from: string) else {
            throw DecodingError.dataCorruptedError(in: container,
                  debugDescription: "Invalid date: " + string)
        }
        return date
    }
}

Ваш Codable Структура события:

struct Event: Codable {
    let title: String
    let start: Date
    let end: Date
}

Соответствие Comparable протоколу

extension Event: Comparable {
    static func < (lhs: Event, rhs: Event) -> Bool { lhs.start < rhs.start }
}

Пользовательский description:

extension Event: CustomStringConvertible {
    var description: String {
        "Title: \(title) - Start: \(Formatter.custom.string(from: start)) - End: \(Formatter.custom.string(from: end))"
    }
}

Тестирование игровой площадки:

Ваша JSON строка:

let json = """
[{"title": "Evening Picnic", "start": "November 10, 2018 6:00 PM", "end": "November 10, 2018 7:00 PM"},
 {"title": "Nap Break", "start": "November 8, 2018 12:56 PM", "end": "November 8, 2018 1:30 PM"},
 {"title": "Football Game", "start": "November 3, 2018 6:14 PM", "end": "November 3, 2018 9:44 PM"}]
"""

Расшифровка вашего JSON

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .monthDayYearTime
do {
    let events = try decoder.decode([Event].self, from: Data(json.utf8))
    print(events.sorted())
} catch {
    print(error)
}

Будет напечатано

[Название: Футбольный матч - Начало: 3 ноября 2018 года, 18:14 - Конец: 3 ноября, 2018 9:44 вечера, Название: Перерыв на сон - Начало: 8 ноября 2018 12:56 - Конец: 8 ноября 2018 13:30, Название: Вечерний пикник c - Начало: 10 ноября 2018 г., 6:00 PM - Конец: 10 ноября 2018 г. 19:00]

...