如何在Swift中将NSObject类对象转换为JSON?

4

I have

var  contacts : [ContactsModel] = []

并且。
class ContactsModel: NSObject
{
   var contactEmail : String?
   var contactName : String?
   var contactNumber : String?
   var recordId : Int32?
   var modifiedDate : String?
}

现在我的联系人中有6个值,如下图所示:

enter image description here

我想将联系人转换为JSON格式,应该怎么做?

我尝试了以下方法:

  var jsonData: NSData?
        do
        {
            jsonData = try NSJSONSerialization.dataWithJSONObject(contacts, options:NSJSONWritingOptions.PrettyPrinted)
        } catch
        {
            jsonData = nil
        }
  let jsonDataLength = "\(jsonData!.length)"

但它会导致应用程序崩溃。

我的问题是手动逐个转换为字典非常耗时,对于 6000 条记录需要超过5分钟的时间,因此我想将模型直接转换为 JSON 并发送到服务器。


1
将6000个包含6个条目的字典转换不应该需要5分钟。你在做什么错误的事情。但是如果没有你的代码,我们将无法帮助你解决问题。 - vikingosegundo
@vikingosegundo 我会检查并更新您。 - Shrikant K
让我们来检查一下。发布代码。 - vikingosegundo
是的,@vikingosegundo,你说得对。在for循环中处理6000条记录只需要2秒钟。我通过将批量大小设置为500并发送到服务器来完成我的问题。 - Shrikant K
你之前是一个一个地发送吗?导致了6000个网络请求?即使在快速网络上,请求也很慢。你应该尽量减少请求的数量。 - vikingosegundo
是的,一次一个地处理6千条数据。现在我每次发送500条记录的数据组,从而使处理时间大大缩短。 - Shrikant K
3个回答

3

如果你只是想要一个简单的Swift对象转JSON静态函数,而不需要任何继承或直接依赖NSObject或NS类型。看看这个:

https://github.com/peheje/JsonSerializerSwift

完全声明。我做了它。简单使用:

//Arrange your model classes
class Object {
  var id: Int = 182371823
  }
class Animal: Object {
  var weight: Double = 2.5
  var age: Int = 2
  var name: String? = "An animal"
  }
class Cat: Animal {
  var fur: Bool = true
}

let m = Cat()

//Act
let json = JSONSerializer.toJson(m)

目前支持标准类型、可选的标准类型、数组、可空标准类型的数组、自定义类的数组、自定义对象的继承和组合。


我的NSObject类没有得到正确的数据,因为它在很多地方都会出现错误。 - Parth Dhorda
Parth,你能否在Github上创建一个问题,包含你正在尝试序列化的类吗? - Peheje

3
您的自定义对象不能直接转换为JSONNSJSONSerialization Class Reference 表示:

可以转换为 JSON 的对象必须具备以下属性:

  • 顶层对象是 NSArray 或 NSDictionary。

  • 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。

  • 所有字典键都是 NSString 的实例。

  • 数字不是 NaN 或无限大。

您可以手动将您的对象转换为 Dictionary 或使用一些类库,如SwiftyJSONJSONModelMantle编辑: 目前,在 Swift 4.0+ 中,您可以使用 Codable 协议轻松地将您的对象转换为 JSON。这是一种原生解决方案,不需要第三方库。请参阅来自 Apple 的Using JSON with Custom Types 文档。

我的顶级对象是一个包含字符串的数组。有没有办法在不使用SwiftyJSON、JSONModel或Mantle的情况下进行转换?我的问题在于手动转换成字典非常耗时,对于6000条记录需要超过5分钟的时间。 - Shrikant K
1
听起来你的代码有问题。转换6000个对象只需要花费毫秒级别的时间,而不是几分钟。 - Adam
@ShivamPokhriyal SwiftyJSON是一个在Github上拥有17k颗星的受欢迎的库。在Apple引入Codable之前,它曾经是许多开发人员的首选库。话虽如此,我编辑了我的答案,添加了一些关于Codable的信息。 - Adam
@Adam,你对他们代码中仍然存在许多未解决问题以及最后一次活动是4个月前的看法是什么?关于Codable协议,如果自定义类具有NSNumber和NSMutableArray类型变量,则无法正常工作。请查看此问题https://stackoverflow.com/questions/52369799/convert-nsobject-to-json-string。我真的很感激任何关于此事的帮助。 - Shivam Pokhriyal
我的答案是在2015年写的,那时使用那些库是有意义的。但我现在不再使用它们了。Codable是2018年的最佳选择。我已经阅读了你的问题,如果可能的话,我会避免在Swift中使用NSObject、NSNumber和NSMutableArray。相反,应该使用Swift类型和值类型。如果不可能,可以考虑使用NSJSONSerialization,正如其他人在评论中建议的那样。 - Adam
显示剩余2条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接