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 继承类

尝试使用 JSONModel 序列化后出错:JSON 写入中的类型无效 (...)

JSONModel(I)

JSONModel:json到数组?

无法从 JSONModel 初始化模型。我得到零值

iOS 中JSONModel的使用