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

时间:2014-06-29 12:05:55

标签: json swift key-value

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

我有User.swift型号:

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

我也想像在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

如何在Swift中创建模型?

6 个答案:

答案 0 :(得分: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)!

答案 1 :(得分: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)
    }
}

这个图书馆有三件好事:

  1. 您不必明确转发String,因为图书馆会推断出类型
  2. 您可以拥有非可选属性,库会告诉您哪个确切字段错误
  3. 模型的所有密钥都在enum中封装,当您键入密钥并确保无法访问密钥时,它会为您提供自动组合,而不是枚举

答案 2 :(得分:2)

以下是Model Class的一些示例代码,并解析了任何库中的JSON响应。

模型类

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

调用web-service 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
            })

答案 3 :(得分:1)

我使用jsoncafe最简单且可自定义的模板基础模型类生成器,包括SwiftyJSON,Codable,Gloss,Simple Swift Class等不同的framwroks,即使你可以制作自己的模板

<强> jsoncafe.com enter image description here

答案 4 :(得分:0)

如果您想要一种更严格的方法并且可以访问JSON模式作为JSON文档的元描述,我编写了一个代码生成器来处理这些(JSON模式,草案4):

https://github.com/werner77/MappableObjectGenerator

我的工具基本上支持任何编程语言,因为它基于代码生成模板,但现在专注于ObjectiveC和Swift 4支持。

答案 5 :(得分:0)

可能为时已晚。

您也可以尝试使用链接 http://www.json4swift.com/results.php 您只需在其中粘贴JSON值,它就会为您提供快速文件。