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?
5 ответов
Я рекомендую использовать генерацию кода для генерации моделей в 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)!
Я бы предложил использовать 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 приятные вещи:
- вам не нужно явно бросать в
String
как библиотека будет выводить тип - вы можете иметь необязательные свойства, и библиотека скажет вам, какое точное поле было неправильным
- все ключи к модели инкапсулированы в
enum
что дает вам автоматического заполнения при вводе ключи и гарантии, что вы не можете получить доступ к ключам, которые не находятся в enum
вот пример кода для класса модели и разбора ответа JSON без какой-либо библиотеки.
Модель Класс
class User: NSObject{
var user_token: String = ""
var email: String = ""
}
пример кода для вызова api веб-службы и синтаксического анализа.
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
})
Я использую jsoncafe самый простой и настраиваемый шаблон генератор базового класса модели с различными framwroks, как SwiftyJSON, кодируемый, глянец, простой Swift класс даже вы можете сделать свой собственный шаблон
Если вы хотите более строгий подход и имеете доступ к схемам JSON в качестве мета-описания для ваших документов JSON, я написал генератор кода ,который может обрабатывать их (схема JSON, проект 4):
https://github.com/werner77/MappableObjectGenerator
мои инструменты поддерживают в основном любой язык программирования, потому что он основан на шаблонах генерации кода, но сосредоточен на поддержке ObjectiveC и Swift 4 прямо сейчас.