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 приятные вещи:

  1. вам не нужно явно бросать в String как библиотека будет выводить тип
  2. вы можете иметь необязательные свойства, и библиотека скажет вам, какое точное поле было неправильным
  3. все ключи к модели инкапсулированы в 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 класс даже вы можете сделать свой собственный шаблон

jsoncafe.com enter image description here


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

https://github.com/werner77/MappableObjectGenerator

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