разобрать JSON массив в swift, отсортировать его и найти перекрывающиеся даты - PullRequest
2 голосов
/ 10 февраля 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"}, {"title": "Evening Cookout with Friends", "start": "November 6, 2018 5:00 PM", "end": "November 6, 2018 10:00 PM"}, {"title": "Roller Derby", "start": "November 7, 2018 12:00 PM", "end": "November 7, 2018 2:30 PM"}, {"title": "Basketball Game", "start": "November 8, 2018 7:30 PM", "end": "November 8, 2018 10:30 PM"}, {"title": "Local Pub with Friends", "start": "November 1, 2018 7:33 PM", "end": "November 1, 2018 11:00 PM"}, {"title": "Dentist Appointment", "start": "November 10, 2018 1:45 PM", "end": "November 10, 2018 2:30 PM"}, {"title": "Volleyball With Friends", "start": "November 6, 2018 12:00 PM", "end": "November 6, 2018 1:26 PM"}, {"title": "Free Donuts", "start": "November 9, 2018 3:00 PM", "end": "November 9, 2018 4:00 PM"}, {"title": "TV Show Marathon", "start": "November 9, 2018 4:30 PM", "end": "November 9, 2018 9:00 PM"}, {"title": "Boba Tea Grand Opening", "start": "November 6, 2018 1:27 PM", "end": "November 6, 2018 2:00 PM"}, {"title": "Lunch with Friends", "start": "November 8, 2018 11:30 AM", "end": "November 8, 2018 12:59 PM"}, {"title": "SF Coffee Festival","start": "November 6, 2018 6:00 PM","end": "November 6, 2018 9:00 PM"}, {"title": "Beer with Friends", "start": "November 9, 2018 8:00 PM", "end": "November 9, 2018 9:30 PM"}, {"title": "Yoga", "start": "November 1, 2018 6:00 PM", "end": "November 1, 2018 7:33 PM"}, {"title": "Rock Concert", "start": "November 7, 2018 6:30 PM", "end": "November 7, 2018 11:00 PM"}, {"title": "Lunch Meeting", "start": "November 9, 2018 12:30 PM", "end": "November 9, 2018 2:30 PM"}, {"title": "Bicycling with Friends", "start": "November 1, 2018 6:00 AM", "end": "November 1, 2018 9:30 AM"}, {"title": "Birthday Party", "start": "November 10, 2018 12:30 PM", "end": "November 10, 2018 8:30 PM"}, {"title": "Football Tailgate with John", "start": "November 3, 2018 6:14 PM", "end": "November 3, 2018 9:44 PM"}]   

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

Ответы [ 2 ]

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

Учитывая, что это дополнительный вопрос из вашего предыдущего поста . Вы можете использовать инициализатор Swift DateInterval , чтобы создать DateInverval с вашими датами start и end и проверить, пересекаются ли они друг с другом:

extension Event {
    var interval: DateInterval { .init(start: start, end: end) }
    func intersects(with event: Event) -> Bool { interval.intersects(event.interval) }
}

Для для проверки конфликтующих событий вам нужно будет привести ваше Событие в соответствие с Equatable и отфильтровать те, которые пересекаются с ними, но не являются тем же событием:

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

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .monthDayYearTime
do {
    let events = try decoder.decode([Event].self, from: Data(json.utf8))
    print(events.sorted())
    let conflictingEvents: [(Event, Event)] = events.compactMap {
        for event in events where event != $0 {
            if event.intersects(with: $0) && $0.end != event.start && event.end != $0.start { return ($0, event) }
        }
        return nil
    }
    print(events.count)             // "21\n"
    print(conflictingEvents.count)  // "11\n"
} catch {
    print(error)
}
0 голосов
/ 10 февраля 2020

Есть только две "сложные" вещи с вашей структурой JSON, которые могут заставить ее бросить гаечный ключ в работах.

Факт в том, что это массив JSON с прямым строением и нестандартный формат даты.

Я бы порекомендовал начать с хорошего учебника, например, Ultimate Guide to JSON Синтаксический анализ со Swift , который может быть де-факто источником, поскольку охватывает практически все варианты использования, которые мне приходилось встречать.

Начнем с определения конструкции, которая будет содержать основные c данные и соответствовать протоколу Codable

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

Создание JSONDecoder и предоставьте ему пользовательский dateDecodingStrategy

let formatter = DateFormatter()
formatter.dateFormat = "MMMM dd, yyyy hh:mm a"

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)

Вам нужно конвертировать JSON ответ в Data. Возможно, я уже был в этом формате, или вы можете напрямую преобразовать текст String, что я и сделал для своего теста

let formatter = DateFormatter()
formatter.dateFormat = "MMMM dd, yyyy hh:mm a"
formatter.locale = Locale(identifier: "en_US_POSIX")

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(formatter)

Наконец, расшифруйте ответ ...

let events = try decoder.decode([Event].self, from: data)

Оттуда вы можете приступить к обработке данных.

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

...