【问题标题】:Swift - Create data model from JSON responseSwift - 从 JSON 响应创建数据模型
【发布时间】:2014-06-29 12:05:54
【问题描述】:

我正在学习 Swift 语言,很高兴听到其他人的意见之一是“您如何处理来自 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 中创建模型?

【问题讨论】:

标签: json swift key-value


【解决方案1】:

我建议使用代码生成在 Swift 中基于 JSON 生成模型。为此,我在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)!

【讨论】:

  • jsonToSwift 是一个好的开始,但还不够。它应该生成单独的文件以减少混乱。但我想它有效。
  • 这是一个非常有用的工具,请继续使用。非常感谢
  • 它以旧的 swift 语法生成
【解决方案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 中,当您键入键时会自动完成并保证您无法访问不在枚举中的键

【讨论】:

  • 我正在使用这个库。非常好的解决方案!谢谢!
【解决方案3】:

这里是一些示例代码,用于模型类并在没有任何库的情况下解析 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
            })

【讨论】:

    【解决方案4】:

    我正在使用jsoncafe 最简单且可自定义的模板基模型类生成器,它具有不同的框架,例如 SwiftyJSON、Codable、Gloss、Simple Swift Class,即使您可以制作自己的模板

    jsoncafe.com

    【讨论】:

      【解决方案5】:

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

      https://github.com/werner77/MappableObjectGenerator

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

      【讨论】:

        【解决方案6】:

        可能为时已晚。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-08
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多