Swift - создание модели данных из ответа JSON

Я изучаю Swift lang и одну из вещей, которые было бы здорово услышать, когда кто-то вводит информацию о том, "Как вы обрабатываете модели из ответов JSON"? Например -

У меня есть модель User.swift:

class User: NSObject {
  var user_token:String?
  var email:String?
}

а также я хотел бы использовать KeyValueObjectMapping, как и в проектах Obj-C. К сожалению, это не работает здесь:

let parser = DCKeyValueObjectMapping.mapperForClass(User)
let user = parser.parseDictionary(data.objectForKey("user") as NSDictionary) as User
println(user.user_token) // returns nil

Как вы создаете свои модели в Swift?

Ответ 1

Я рекомендую использовать генерацию кода для генерации моделей в Swift на основе JSON. С этой целью я создал инструмент http://www.guideluxe.com/JsonToSwift, чтобы сделать как можно проще моделирование и синтаксический анализ JSON.

После того, как вы отправили образец объекта JSON с именем класса в инструмент, он будет генерировать соответствующий класс Swift, а также любые вспомогательные классы Swift для представления структуры, подразумеваемой образцом JSON. Также включены методы класса, используемые для заполнения объектов Swift, в том числе метода, который использует метод NSJSONSerialization.JSONObjectWithData. Предусмотрены необходимые отображения из объектов NSArray и NSDictionary.

После копирования сгенерированного кода в ваш проект как класса Swift вам нужно будет предоставить объект NSData, содержащий JSON, который соответствует образцу, предоставленному инструменту.

Кроме Foundation, никаких зависимостей нет.

Здесь, как создать объект NSData из файла JSON для тестирования.

let fileUrl: NSURL = NSBundle.mainBundle().URLForResource("JsonFile", withExtension: "json")!
let jsonData: NSData = NSData(contentsOfURL: fileUrl)!

Ответ 2

Я бы предложил использовать SwiftyJSONModel там, где ваша модель будет выглядеть примерно так:

import SwiftyJSONModel

class User: NSObject, JSONObjectInitializable {
    enum PropertyKey : String {
        case user_token, email
    }

    var user_token:String?
    var email:String?

    required init(object: JSONObject<PropertyKey>) throws {
        user_token = object.value(for: .user_token)
        email = object.value(for: .email)
    }
}

В этой библиотеке есть 3 приятных вещи:

  1. Вам не нужно явно приводить к String поскольку библиотека выведет тип
  2. Вы можете иметь необязательные свойства, и библиотека сообщит вам, какое поле было неправильным
  3. Все ключи к модели инкапсулированы в enum что дает вам автозаполнение при вводе ключей и гарантирует, что вы не можете получить доступ к ключам, которые не находятся в enum

Ответ 3

Вот пример кода для класса модели и разбора ответа JSON без какой-либо библиотеки.

Модельный класс

class User: NSObject{
     var user_token: String = ""
     var email: String = ""
}

Пример кода для вызова web-сервиса api и Parsing.

NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
                var err: NSError
                var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
                //println("Result : \(jsonResult)")
                let model = User()
            model. user_token = jsonResult["user_token"] as NSString
            model. email = jsonResult["email"] as NSString
            })

Ответ 4

Я использую jsoncafe самый простой и настраиваемый генератор класса базовой модели шаблонов с различными фреймами, такими как SwiftyJSON, Codable, Gloss, Simple Swift Класс даже вы можете создать свой собственный шаблон

jsoncafe.com введите описание изображения здесь

Ответ 5

Если вы хотите более строгий подход и имеете доступ к JSON-схемам в качестве мета-описания для ваших JSON-документов, я написал генератор кода, который может их обрабатывать (JSON-схема, черновик 4):

https://github.com/werner77/MappableObjectGenerator

Мои инструменты поддерживают практически любой язык программирования, потому что он основан на шаблонах генерации кода, но в настоящее время сосредоточен на поддержке ObjectiveC и Swift 4.

Ответ 6

Может быть, уже слишком поздно.

Вы также можете попробовать воспользоваться ссылкой http://www.json4swift.com/results.php где вам просто нужно вставить значения JSON, и вместо этого вы получите файлы swift.