Как сохранить json в файл swift

Обновлено: 07.07.2024

Формат данных JSON широко используется в современной сети и является одним из наиболее распространенных способов передачи данных. Многие современные API, в частности веб-сервисы RESTful , поддерживают формат данных JSON.

В этом руководстве я покажу вам, как работать с форматом данных JSON на языке программирования Swift для iOS, tvOS, watchOS и OS X.

Предпосылки

Это руководство требует, чтобы вы работали как минимум с Xcode 7, который включает в себя версию 2 языка программирования Swift. Swift 2 представил ряд важных дополнений, которые мы будем использовать в этом руководстве, таких как обработка ошибок и оператор guard .

1. Что такое JSON?

Следующий фрагмент является примером формата данных JSON. Это фрагмент, который мы будем использовать в этом уроке.

Как видите, формат данных JSON прост для понимания. JSON структурирован с использованием двух типов коллекций, словарей и массивов. Словари содержат одну или несколько пар ключ-значение и заключены в фигурные скобки <> . Массивы содержат список упорядоченных элементов и заключены в квадратные скобки, [] . Почти каждый язык программирования определяет эти типы коллекций, поэтому JSON поддерживается почти каждым языком вокруг.

Ниже приведен список поддерживаемых типов данных в объекте JSON:

  • строка
  • Число (целое число, число с плавающей запятой, двойное число и т. Д.)
  • логический
  • массив
  • Словарь

2. Чтение данных JSON

Шаг 1: Создать игровую площадку

Запустите Xcode и создайте новую игровую площадку. Дайте детской площадке имя и установите Платформу на iOS .

Шаг 2: Добавить данные JSON

Откройте навигатор слева и разверните игровую площадку JSON . Щелкните правой кнопкой мыши папку « Ресурсы » и выберите « Новый файл» в меню.

Добавить данные JSON

Назовите файл data.json и заполните файл следующим JSON.

Шаг 3: Получение данных

Теперь, когда у вас есть общее представление о том, что такое формат данных JSON, пришло время начать работать с ним в Swift. Удалите содержимое игровой площадки и добавьте к нему следующие три строки кода.

С помощью этого кода мы получаем ссылку на файл JSON, который мы добавили на площадку несколько минут назад, и получаем его содержимое в виде необработанных данных. Обратите внимание, что созданный здесь URL-адрес является локальным для файла на вашем компьютере. Это может быть URL-адрес веб-службы или любой другой URL-адрес, который может вам понадобиться.

Также важно понимать, что необработанные данные объекта JSON не должны собираться таким образом. Единственной важной частью является необработанный объект NSData , который может быть получен из URL-адреса, как показано в примере, ответа API или из ряда других источников.

Шаг 4: Разбор данных

Следующим шагом является анализ и сериализация этих данных в объект, который мы можем использовать. К счастью, в iOS и OS X класс Foundation NSJSONSerialization выполняет всю сложную работу по синтаксическому анализу и сериализации для вас. Добавьте следующий фрагмент кода на свою игровую площадку.

let object = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)

Сначала мы включаем всю нашу логику в оператор do-catch , потому что сериализация из данных JSON потенциально может вызвать ошибку. Затем мы вызываем метод JSONObjectWithData(_:options:) класса NSJSONSerialization , передавая объект NSData и некоторые параметры. Параметры, которые могут быть переданы, определяются структурой NSJSONReadingOptions :

  • AllowFragments Это позволяет AllowFragments объекты в пределах первого или верхнего уровня данных JSON, которые не являются массивами или словарями. В данных JSON, используемых в этом руководстве, они включают значения как dataTitle и swiftVersion .
  • MutableLeaves Этот параметр позволяет автоматически создавать строки, считываемые из данных JSON, в качестве экземпляров NSMutableString . Эта опция больше подходит для разработки Objective-C. В Swift вы можете игнорировать эту опцию, поскольку строки представляют собой встроенный базовый тип данных и автоматически изменяются при определении с помощью ключевого слова var .
  • MutableContainers Это позволяет массивам и словарям, считываемым из данных JSON, также быть изменяемыми. Как и в MutableLeaves параметром MutableLeaves , в Swift использование ключевого слова var при назначении массива / словаря переменной автоматически делает его изменчивым.

Наконец, мы проверяем, имеет ли сериализованный объект ожидаемый тип [String: AnyObject] и, если это так, вызываем readJSONObject(_:) . Давайте посмотрим на метод readJSONObject(_:) .

Шаг 5: Работа с данными

После анализа и сериализации собранных вами данных JSON вы можете взаимодействовать с ними так же, как и с любым другим словарем. Добавьте следующую функцию на игровую площадку над оператором do-catch .

Как видите, с сериализованными данными JSON можно взаимодействовать точно так же, как с обычным словарем или массивом. Вышеупомянутая readJSONObject(_:) служит примером того, как вы можете извлечь информацию из сериализованного объекта JSON. Обратите внимание, что я включил в функцию оператор switch просто для разделения строк в выводе игровой площадки.

Как только игровая площадка закончит выполнение вашего кода, вы должны увидеть результат на боковой панели, подобный следующему.

Выход на игровую площадку

Поздравляю. Теперь вы знаете, как извлечь данные JSON, сериализовать их и использовать в качестве обычного словаря в своем коде Swift. Как видите, этот процесс очень прост благодаря API NSJSONSerialization , который выполняет большую часть тяжелой работы за нас.

3. Написание данных JSON

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

Этот вопрос задавался несколько раз за прошедшие годы, но в Swift 5 он снова изменился снова , особенно в двух последних бета-версиях.

Чтение файла JSON кажется довольно простым:

Но писать невероятно сложно, и все предыдущие методы, найденные на этом сайте, потерпели неудачу в Swift 5 на Xcode 11 бета-версии 5 и 6.

Как я могу записать данные в файл JSON в Swift 5?

Я попробовал эти подходы:

Не было никаких ошибок, кроме предупреждений об устаревании, и когда я их исправил, они просто не работали.

3 ответа

Давайте на секунду предположим, что у вас была какая-то случайная коллекция (либо массивы, либо словари, либо некоторая их вложенная комбинация):

Затем вы можете сохранить его как JSON в каталоге «Поддержка приложений» следующим образом:

Для обоснования того, почему мы теперь используем каталог «Поддержка приложений», а не папку «Документы», см. видео с рекомендациями по хранению iOS или обратитесь к Руководство по программированию файловой системы. Но, независимо от этого, мы используем эти папки, а не папку «связки» Приложения, которая доступна только для чтения.

И прочитать этот файл JSON:

При этом мы обычно предпочитаем использовать строго типизированные пользовательские типы, а не случайные словари, когда программисту приходится нести ответственность за то, чтобы в именах ключей не было опечаток. В любом случае, мы делаем эти пользовательские struct или class типы соответствующими Codable :

Тогда мы будем использовать JSONEncoder , а не более старый JSONSerialization :

И прочитать этот файл JSON:

Дополнительную информацию о подготовке JSON из пользовательских типов см. В кодировании и декодировании пользовательских типов статья или пример кода JSON с пользовательскими типами.

Отвечая на вопрос:

Скажем так, у меня есть некоторые данные JSON - как мне записать их в файл file.json? Это в моем каталоге проектов - это доступно для записи? А если нет, как бы я сделал это доступным для записи?

Предполагая, что «некоторый JSON» означает массив словарей как [<String, String>] , вот простой пример того, как вы можете это сделать:

Учтите, что у нас есть следующий массив, который нам нужно записать в файл в виде JSON:

Первое, что нужно сделать, это преобразовать его в JSON (как экземпляр Data ). Для этого есть более одного варианта, давайте используем JSONSerialization один:

На этом этапе вы должны увидеть на консоли:

Что наши данные отформатированы как действительный JSON.

Далее нам нужно записать это в файл. Для этого мы будем использовать FileManager как:

Обратите внимание, что файл должен существовать в каталоге документов; В приведенном выше примере его имя должно быть «MyFile.json».

В случае, если кто-то работает с пользовательскими объектами (как и я) и хочет более универсальную функцию с обобщениями

JavaScript Object Notation, или сокращенно JSON является самым распространенным способом связи с сервером и получения информации с него. Он чрезвычайно популярен из-за простоты в использовании и восприятии.

Рассмотрим следующий фрагмент JSON:


В Objective-C, парсинг и десериализация JSON достаточно простая:


В Swift, это более сложный процесс из-за опциональных (optionals) типов и типобезопасности:


В представленном выше коде, необходимо проверять каждый объект до его использования optional binding. Это защитит ваш код; но чем сложнее JSON, тем более громоздким становится код.

В Swift 2.0, был введено оператор guard для того, чтобы избавиться от вложенных выражений if:

Все еще многословно? Но как это упростить?

В этой статье по работе с JSON используется простейший способ парсинга JSON – используя популярную общедоступную библиотеку Gloss.

Так, в частности вы будете использовать Gloss для парсинга и преобразования JSON, который вмещает в себе 25 популярных приложений в US App Store. Так же просто, как и в Objective-C!

С чего начать

Поскольку пользовательский интерфейс не нужен, будем работать исключительно с playground'oм.

Откройте Swift.playground в Xcode и изучите его.

Заметка: Вы можете заметить, что Project Navigator по умолчанию закрыт. Если это так, нажмите Command+1 чтобы вывести его на экран. У вас должно получится так как на изображению ниже.


Стартовый файл playground вмещает несколько исходных и ресурсных файлов, которые полностью сосредоточены на парсинге JSON. Обратите внимание на структуру playground'a:

  • Папка Resources содержит ресурсы, доступ к которым может быть получен через ваш Swift-код
  • topapps.json: Содержит строку для парсинга JSON.
  • Папка Sources содержит дополнительные исходные файлы, к которыми ваш код в playground имеет доступ. Добавление файлов поддержки .swift в эту папку должен быть с обдуман, это принесет простоту чтения вашего playground'a.
  • App.swift: Структура старого простого Swift представляет собой приложение. Ваша цель — разбор JSON на коллекции объектов.
  • DataManager.swift: Управляет извлечением данных из локальной сети или Интернета. Используйте методы этого файла для последующей загрузки JSON.

Как только вы разобрались в данном playground'e, продолжайте читать статью!

Первичный способ разбора JSON в Swift

Во-первых, начнем с нативного способа парсинга JSON в Swift – то есть не используя внешних библиотек. С помощью этого, вы оцените преимущества использования такой библиотеки как Gloss.

Заметка: Если вы уже изучили недостатки нативного способа парсинга JSON и хотите перейти к Gloss, пропустите следующий абзац.

Перед тем как начать работу со словарями, задайте дополнительное имя (alias) вверху playground'a:

typealias Payload = [String: AnyObject]

Добавьте код обратного вызова getTopAppsDataFromFileWithSuccess как показано ниже:

  1. Сначала вы десериализируете данные используя NSJSONSerialization.
  2. Необходимо проверить каждое значение индексов в объекте JSON, чтобы предупредить появление nil. Как только найдено допустимое значение, продолжайте искать следующие объекты. Пройдя все индексы, вы получите значения name и link с которыми предстоит работать. Учтите, что если хотя бы один элемент JSON окажется непредвиденным, имя приложение не будет выведено на экран. Это желательная обработать в этом случаи.
  3. Последний шаг – инициализация объекта App используя значения name и link и вывод их в консоль.

Потребовалось довольно большое количество код для получения названия первого приложения – пора посмотреть, как с этим справится Gloss.

Знакомство с преобразованием объектов с JSON

Преобразование объектов (Object mapping) представляет собой технику превращения объектов c JSON в объекты Swift. После определения моделей (model objects) и правил отображения (mapping rules), Gloss проделывает сложную работу исполняя вместо вас парсинг.

  • Ваш код будет чище, его можно будет повторно использовать и в свою очередь проще поддержать.
  • Вы больше работаете с объектами, а не комплексами обобщённого типа и словарями.
  • Можно расширить классы моделей для добавления дополнительных функций.

Разбор JSON с помощью Gloss

Чтобы все выглядело безупречно, создайте новый playground Gloss.playground, затем скопируйте файл topapps.json в папку Resources и DataManager.swift и папку Sources.

Внедрение Gloss в проект

  1. Нажмите эту ссылку Gloss Repo Zip File и сохраните библиотеку в подходящее место.
  2. Распакуйте ее и перетащите папку Gloss-master/Gloss/Gloss в папку Sources вашего playground.

Project Navigator

Ваш Project Navigator должен выглядеть следующим образом:

Это всё! Теперь Gloss добавлен в ваш проект и вы можете начать разбор JSON без головной боли!

Заметка: Gloss можно установить так же через Cocoapods. Поскольку playground их пока не поддерживают, этот способ можно использовать только при работе с проектами.

Преображение JSON в объекты

Сначала выясните как ваш объект относится к вашему JSON документу.

Необходимо, чтобы объект соответствовала протоколу Decodeable, который может декодировать их с JSON. Чтобы сделать это, осуществите инициализацию init?(json: JSON) как сказано в протоколе.

Обратите внимание на структуру topapps.json и создайте модель данных.

Модель TopApps представляет собой объект высшего уровня, который вмещает в себе одну пару ключ-значения (key-value)

Создайте новый файл с названием TopApps.swift и поместите его в папке Sources вашего playground'a; добавьте следующий код:

  1. Определите параметры для модели. В этом случае, он будет один. Позже вы добавите объект Feed.
  2. Реализуя пользовательский инициализатор, убедитесь, что TopApps соответствует протоколу. Вы должно быть удивитесь, что такое <


Создайте новый файл с названием Feed.swift в папке Sources вашего playground'a и опишите его следующим образом:


App
Самым последним объектом, который надо описать является объект App. Приложение представлено в виде такой схемы:


Создайте новый файл с названием App.swift в папке Sources вашего playground'a и добавьте следующий код:

  1. И Feed и TopApp использовали опциональные свойства (optional properties). Свойство может быть определено как не опциональное (non-optional) только в том случае, если использованный JSON всегда будет содержать значения для заполнения их.
  2. Не обязательно создавать объект для каждой составляющей в JSON. Например, в этом случае нет смысла создавать модель для in:name и id. Во время работы с неопциональными и вложенными объектами, не забывайте проверять nil.

Теперь, когда ваши классы готовы, остается позволить Gloss делать свою работу!
Откройте файл playground'a и добавьте следующий код:

Серьезно — это — весь код, в котором мы нуждаетесь.

Сохраните и запустите ваш playground; вы снова успешно получили название приложения, но более изящным способом.


Все это относится к разбору локальных данных. Но как на счет разбора данных с удаленного ресурса?

Получение JSON с сети

Настало время сделать этот проект более реальным. Обычно, вы получаете данные c удаленного ресурса, а не с локальных файлов. Можно легко получить рейтинги с App Store с помощью сетевого запроса.

Откройте DataManager.swift и найдете URL для получения лучших приложений:

Затем добавьте следующий метод к реализации DataManager:


Код выше выглядит довольно знакомым; но вместо получения данных с локального файла, мы использовали NSURLSession, чтобы получить данные с iTunes. Вот что конкретно происходит:

  1. Сначала вы вызываете метод loadDataFromURL; он требует URL-адрес и функцию замыкания, которая передает объект NSData.
  2. Используя дополнительную привязку, удостоверяемся в существовании данных.
  3. В конечном счете, вы предаете данные успешному завершению, как делали раньше.

Откройте ваш playground и замените следующий код:


Теперь вы получили настоящие данные с iTunes.

Сохраните и запустите ваш playground; вы увидите, что разбор информаций по-прежнему приводит к тому же конечному итогу:

Значение выше может отличаться, поскольку популярные приложения App Store постоянно меняются.

Часто люди не заинтересованы лишь в ТОП приложениях App Store — они хотят видеть список всех ТОП приложений. Не нужно кодить, чтобы их получить. Достаточно добавить следующий фрагмент кода:

Gloss – скелеты в шкафу


Не сложно заметить, что Gloss чудесно выполняет работу парсинга – но что за этим стоит? <
  • Простые типы (Decoder.decode)
  • Модели Decodable(Decoder.decodeDecodable)
  • Простые массивы (Decoder.decode)
  • Массивы и модели Decodable (Decoder.decodeDecodableArray)
  • Enum (Decoder.decodeEnum)
  • Массивы Enum (Decoder.decodeEnumArray)
  • NSURL (Decoder.decodeURL)
  • Массивы NSURL (Decode.decodeURLArray)

Заметка: Если у вас есть желание больше изучить Custom Operators, посмотрите статью: Operator Overloading in Swift Tutorial

В этой статье мы рассматривали декодируемые модели. Если вам необходимо что-то посложнее, расширьте Decoder и произведите собственную реализацию декодирования.

Конечно, с помощью Gloss можно так же конвертировать объекты в JSON. Если вам это интересно, просмотрите Encodable протокол.

Что дальше?

Вы можете использовать playground как начальный шаг для создания нового приложения; просто замените URL получения данных удаленно с вашим собственным URL, управляйте собственными ключами и индексами вашего нового JSON, и вы создадите новый проект, который буде разбирать что-то, например, результатов футбольных матчей или другие данные полученные с сети.

Разработка Gloss продолжается тут на Github, так что следите за последними обновлениями.

Swift все еще эволюционирует, поэтому вы должны следить за новой документацией от Apple на случай будущих обновлений языка.

Надеюсь вам понравилась эта статья о работе с JSON. Если у вас есть вопросы или замечания, их можно обсудить ниже!

Я новичок в Swift и у меня проблемы с этим. так что мне нужно сделать, это сохранить этот массив в виде файла JSON в папке документов на iphone.

а затем позже сможет прочитать его обратно в другой массив. Может кто-нибудь сказать, пожалуйста, как это сделать? или предоставляется точный код для достижения этой цели.

Отредактировано: Я нашел один пример этого. Вот как они настраивают данные:

и вы можете получить к нему доступ таким образом:

Но я должен быть в состоянии сделать то же самое, но из файла, который сохранен в папке документа.

Я рекомендую вам использовать SwiftyJSON framework. Изучите его документацию и, кроме того, научитесь записывать строки в файлы (подсказка: NSFileHandle )

Что-то вроде приведенного ниже кода, но вам действительно нужно изучить SwiftyJSON и NSFileHandle, чтобы узнать, как сериализовать данные JSON в файл и анализировать данные JSON из файла.

Если вы похожи на меня, кто не любит использовать совершенно новую стороннюю инфраструктуру только для таких тривиальных вещей, как это, вот мое решение в Vanilla Swift. От создания файла .json в папке Documents до записи в него JSON.

Следующий код Swift 3/iOS 10 показывает, как преобразовать экземпляр Array в данные json и сохранить его в файл json, расположенный в каталоге документов iPhone с помощью FileManager и JSONSerialization :

В качестве альтернативы вы можете реализовать следующий код, который использует потоки:

Следующий код Swift 3/iOS 10 показывает, как получить данные из файла json, расположенного в каталоге документов iPhone, и преобразовать его в экземпляр Array , используя FileManager и JSONSerialization :

В качестве альтернативы вы можете реализовать следующий код, который использует потоки:

Игровая площадка, расположенная в Github's Save-and-read-JSON-from-Playground repo, показывает, как сохранить Swift Array в файл json и как прочитать файл json и получить из него Swift Array .

В Swift 4 это уже встроено в JSONEncoder .

Объект, который вы пытаетесь кодировать, должен соответствовать протоколу Encodable .

Прочитайте официальное руководство Apple о том, как расширить существующие объекты для кодирования.

Вот общее решение Swift

Я создал общий класс, который позволяет сделать это легко

Вот несколько вспомогательных методов extension FileManager

Вот метод расширения String

Как это использовать ?

Примечание: вы можете определить свой собственный WSCacheKeys для типа вашего json, как я выбираю какой-то список кампаний



JSON (JavaScript object notation) - это распространенный формат передачи данных на веб-серверы.

JSON очень прост в использовании и удобен для чтения, что делает его невероятно популярным.

Разберем следующий фрагмент JSON:

В Objective-C парсинг и десериализация JSON достаточно просты:

Парсинг и десериализация в Swift проходят более утомительно из-за опционалов Swift:

В коде выше, каждый объект JSON должен быть проверен перед использованием, через опциональную привязку. Это делает наш код более безопасным, но и более уродливым.

В этом руководстве вы изучите более простой способ парсинга JSON в Swift, путем использования открытой библиотеки SwiftyJSON.

В частности, вы будете использовать SwiftyJSON для разбора JSON документа, который содержит 25 топовых приложений в US AppStore. Вы увидите, что разбор JSON в Swift, может быть таким же простым, как и в Objective-C.

Заметка

Чтение этого туториала предполагает наличие у вас начальных знаний в Swift. Если вы таких не имеете, то скорее проходите наше первое знакомство со Swift.

Поехали!

Скачайте начальный проект и запустите его. Вы увидите пустой view controller:


Стоит оговориться, что пользовательский интерфейс не особо важен для данного туториала, так как вы будете работать только с консолью. Привыкайте в вашему белому экрану! :]

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

  1. TopApps.json: содержит JSON для парсинга.
  2. AppModel: Файл отображающий наше приложение. Ваша цель - разобрать JSON в коллекцию этих объектов.
  3. DataManager: Управляет получением данных локально или по сети. Вы будете использовать методы этого файла для загрузки JSON.
  4. ViewController: Пустой view controller. Вы добавите сюда код для запроса данных из DataManager.swift и отпарсите его несколькими способами.

Надеюсь, вы разобрались, что находится в стартовом проекте. Теперь, давайте двигаться дальше!

Разбираем JSON нативным способом Swift

Заметка

Думаю, вы уже знакомы с болью, которая возникает каждый раз, когда вам нужно отпарсить JSON. И, если вы не мазохист :], то вам лучше пропустить эту секцию и сразу перейти к SwiftyJSON.

Сначала, мы отпарсим JSON оригинальным способом Swift, то есть мы не будем использовать никаких внешних библиотек. Это поможет нам оценить пользу библиотеки SwiftyJSON.

Давайте отпарсим предоставленный нам файл JSON, для того, чтобы получить имя первого в списке лучших приложений US AppStore.

Откройте ViewController.swift и добавьте следующий код в конец метода viewDidLoad():

Прокручиваете глазами этот каскадный список закрывающихся скобок? :] Вот что у нас тут происходит:

  1. Сначала вы десериализуете (преобразуете из последовательного формата в параллельный), используя NSJSONSerialization .
  2. Затем, вам нужно проверить каждое значение сабскрипта в объекте JSON, чтобы убедиться, что они не nil .
  3. После того, как вы уверены, что они не nil , вы ищите следующий объект.
  4. После того, как вы прошли весь путь через все сабскрипты, вы получаете отображение значения appName .

Если какой-либо элемент в JSON будет неожиданным, то вы получите полный беспорядок и имя приложения никогда не появится у вас на экране.

  1. Последний шаг - просто выводим значения appName в дебаггере.

Запустите ваше приложение: вы должны увидеть в вашей консоли дебаггера вот что:

Мы написали достаточно много кода, для того, чтобы получить всего лишь название приложения. Самое время посмотреть как будет работать SwiftyJSON.

Интрегрирование SwiftyJSON в ваш проект

Эту библиотеку очень просто интегрировать.

Перейдите на страницу SwiftyJSON github. Затем, перетащите SwiftyJSON\SwiftyJSON.swift в наигацию вашего проекта Xcode. Убедитесь, что у вас стоит галочка на Copy items if needed и что у вас выбрано TopApps, затем, нажмите Finish

Вот и все! Вы только что интегрировали библиотеку в ваш проект, и теперь вы можете парсить JSON без головной боли опциональной привязки!

Парсим JSON через SwiftyJSON

Замените метод viewDidLoad() следующим:

И это весь код, который вам понадобится!

Сначала, вы создаете константу JSON , через метод int типа JSON() и ваш объект данных. Затем, SwiftyJSON конвертирует эти данные в объект JSON, используя NSJSONSerialization .

Бонус использования библиотеки в том, что она берет на себя все опциональные проверки, которые ранее вы делали вручную. Все что вам нужно, это знать ключи и индексы, которые вы хотите получить, а остальное вы можете доверить SwiftyJSON.

Итак, мы хотим получить строковое значение, по этому передаем .stringValue в конец процесса парсинга. Если необходимо получить массив, то передаем .arrayValue . Остальные возвращаемые типы используют аналогичную конструкцию.

Запустите ваше приложение, и вы увидите, как получено имя приложения, только, теперь вы использовали значительно меньше кода:

Библиотека берет на себя парсинг локальных данных, но как она работает с удаленным источником данных?

Получение удаленного JSON

Самое время сделать наш проект более реальным. Обычно, мы будем получать удаленные данные и не с локального файла. Вы можете просто взять рейтинг приложений AppStore, используя онлайн запрос.

Идем в DataManager.swift и добавляем следующий метод:

Этот код выглядит достаточно знакомым, но вместо получения локального файла, вы используете NSURLSession , для извлечения данных с iTunes. Вот что происходит в деталях:

Сначала вы вызываете метод loadDataFromURL() , который принимает URL и замыкание (closure), которое передает объект NSData . Следующим шагом вы проверяете существование значения, используя опциональную привязку. Наконец, вы передаете данные в замыкание success, как мы делали ранее. Откройте ViewController.swift и добавьте следующие строки в конец метода viewDidLoad() :

Код выше практически такой же, как тот, который вы писали в первой секции, но теперь вы получаете данные из iTunes.

На самом деле, значения сверху могут отличаться, так как лучшие приложения AppStore тоже меняются.

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

Разбираем JSON для заполнения массивов

Добавьте следующий код в ViewController.swift, сразу после комментария "More soon":

Код, который приведен выше, перебирает все приложения в ответе JSON и создает модели объекта AppModel:

  1. Сначала вы получаете список приложений с SwiftyJSON
  2. Следующим шагом вы создаете изменяемый массив для хранения объектов, которые будут созданы.
  3. Затем, вы перебираете все элементы и создаете AppModel из данных JSON.
  4. И последнее, вы выводите на экран список новых объектов в консоли дебаггера.


В реальных приложениях вы можете использовать код, написанный выше, и можете реализовать UICollectionView и UITableView для отображения этих результатов.

Вот и все что нужно, для использования JSON в Swift. Остальная часть туториала опциональна, так как она посвящена работе SwiftyJSON непосредственно под "капотом".

Заглядываем под капот SwiftyJSON

Вы конечно уже можете оценить, как хорошо работает SwiftyJSON, но давайте заглянем ему под капот.

Когда вы вызываете JSON() , вы передаете экземпляр опционального NSData или даже AnyObject . JSONValue() является инициализатором для перечисления (enum) в SwiftyJSON:

Оно работает через сабскрипт языка Swift:

Обратите внимание, что результатом оператора сабскрипта является другой объект JSON. Зависит от вас, какой тип вы хотите вернуть из этого JSON. В нашем случае, мы хотим вернуть имя приложения, то есть тип Sting , так что вы просто добавляете .stringValue в конец объекта JSON.

Метод string() один из множества способов, которые названы в честь типа, который они возвращают из объекта JSON. Каждая функция возвращает опциональную тезку типа.

Обратите внимание, что все значения являются опциональными, так что мы защищены от значения равного nil . Вот так SwiftyJSON обрабатывает опциональную привязку.

Но, мы пока что еще не затронули обработку ошибки в SwiftyJSON. Вот как можно обработать неправильное условие в SwiftyJSON:

Мы очень рекомендуем посмотреть как работает SwiftyJSON, так как эта библиотека демонстрирует качественную комбинацию полезных техник Swift, для получения отличного результата.

Конечный проект вы можете скачать здесь.

Что дальше?

Дальше, вы можете продолжить изучать наши туториалы по мере их появления, а также, параллельно читать перевод официальной книги по языку программирования Swift. И, для более подробного изучения языка, вы можете пройти наши курсы!

Читайте также: