Swift 中的 JSONModel 问题
Posted
技术标签:
【中文标题】Swift 中的 JSONModel 问题【英文标题】:JSONModel in Swift issue 【发布时间】:2014-09-01 18:51:09 【问题描述】:我正在尝试使用 JSONModel 将 json 映射到 Swift 中的模型。
如果模型没有 JSONModel 子类的属性,一切正常。
所以在示例中这是可行的,并且它成功地映射了属性:
class Person: JSONModel
var name: NSString?
var gender: NSString?
但是如果我把JSONModel子类City,这个属性没有初始化,并且当我稍后尝试访问city属性时它会崩溃应用程序(我可以成功访问person.name和person.gender,但是在person.city上它在没有任何信息的情况下崩溃):
class Person: JSONModel
var name: NSString?
var gender: NSString?
var city: City? // City is JSONModel subclass
如果 JSONModel 是 JSONModel 子类,它看起来无法映射/解析属性。 有没有人遇到过并解决了?
【问题讨论】:
您是否使用 JSONModel 获得了解决方案?或者您切换到不同的库。 在类声明前添加@objc(classname) 感谢 vburojevic 的回复。你的意思是这样的:@objc class Person: JSONModel var name: NSString?变量性别:NSString? var city:城市? 我在 Xcode 8.1、Swift 3.0 中创建了我的项目。我正在尝试使用 JSONModel 但我没有找到任何解决方案。如果您找到任何解决方案,请告诉我。可能提供源代码示例。提前致谢。 【参考方案1】:JSONModel 在 Swift 中不起作用,这就是您遇到问题的原因。来自JSONModel readme:
注意:Swift 在底层的工作方式与 Objective-C 不同。 因此我找不到在 Swift 中重新创建 JSONModel 的方法。 Objective-C 中的 JSONModel 通过 CocoaPods 或作为 一个导入的 Objective-C 库。
您也许可以让它在某些边缘情况下工作 - 但使用它的唯一可靠方法是针对它编写 Objective C 代码,并使用这些 Objective C 类。如果你想做纯 Swift,你应该看看其他库,比如 Argo 和一堆其他的。
【讨论】:
【参考方案2】:其实Swift中JSONModel的问题如下:
它使用 Objc-runtime 来了解每个属性是什么类型,并且一旦您声明了 Obj-c 运行时不知道如何映射的类型,那么 JSONModel 只能将其映射为 String ...... ...或 NSNumber 如果您知道您有一个数字字段。
它的工作方式: 因此,基本上,如果您将所有在您的案例中保持为 nil 的属性声明为字符串,您将开始看到值。如果您将数字字段声明为 NSNumber,则同样适用。 String 和 NSNumber 也可以声明为可选项,对于 JSONModel 没有特定问题。
但是你敢不敢在 Swift 中使用带有可选声明的原始类型(Int?、Double?、Bool?)。这行不通。
有效的方法是避免通过以下方式声明为可选:
1) var tmpInt : Int = 0,给出默认值
2) var tmpInt : Int!,强制
当然,这些最后的“变通办法”完全违背了 Swift 出现在这个世界上的原因,但这就是你如何将旧的 Objective-C 习惯带入新的现代 Swift (;
【讨论】:
【参考方案3】:也许将访问级别设置为“公共”可能会有所帮助?
public class Person: JSONModel
public var name: NSString?
public var gender: NSString?
public var city: City? // City is JSONModel subclass
public class City: JSONModel
public var name: NSString?
【讨论】:
以上是关于Swift 中的 JSONModel 问题的主要内容,如果未能解决你的问题,请参考以下文章
JsonModel 无法将 json 中的数组转换为 jsonmodel 继承类