Swift - 从JSON响应创建数据模型

Kos*_*ika 11 json key-value swift

我正在学习Swift lang,其中一个很好听到别人输入的内容是"你如何处理来自JSON响应的模型"?例如 -

我有User.swift模特:

class User: NSObject {
  var user_token:String?
  var email:String?
}
Run Code Online (Sandbox Code Playgroud)

我也想像在Obj-C项目中那样使用KeyValueObjectMapping.不幸的是,这不起作用:

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

你如何在Swift中创建模型?

Per*_*let 8

我建议使用代码生成来基于JSON在Swift中生成模型.为此,我在http://www.guideluxe.com/JsonToSwift上创建了一个工具,使JSON的建模和解析变得尽可能简单.

在您将具有类名的示例JSON对象提交给工具之后,它将生成相应的Swift类以及任何所需的子Swift类,以表示示例JSON隐含的结构.还包括用于填充Swift对象的类方法,包括使用NSJSONSerialization.JSONObjectWithData方法的方法.提供了NSArray和NSDictionary对象的必要映射.

在将生成的代码作为Swift类复制到项目中之后,您只需提供一个包含JSON的NSData对象,该对象与提供给该工具的示例相匹配.

除了Foundation之外,没有依赖关系.

以下是如何从JSON文件创建NSData对象以进行测试.

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


Noo*_*ass 5

我建议使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这个图书馆有3件好东西:

  1. 您不必显式转换String为库,将推断该类型
  2. 您可以拥有非可选属性,库将告诉您哪个确切的字段是错误的
  3. 模型的所有键都是封装的enum,当你键入键并保证你不能访问密钥时,它会自动进行组合,而不是枚举