Swift3中自定义对象列表转JSON方法求助,代码执行崩溃
嘿,这个问题我之前踩过坑!你直接把自定义对象数组传给JSONSerialization肯定会崩,因为它只认Foundation原生类型(比如[String: Any]、[Any]、String、NSNumber、Bool、nil这些),你的MyObject是自己定义的类/结构体,不在这个支持列表里,系统没法解析它,自然就崩溃了。
下面给你两种可行的解决方案:
方案1:手动将自定义对象转为字典,再序列化
先给你的MyObject添加一个方法,把对象的所有属性转成字典格式——这相当于给系统提供一个它能识别的“中间格式”:
class MyObject: NSObject { var name: String var age: Int var isActive: Bool init(name: String, age: Int, isActive: Bool) { self.name = name self.age = age self.isActive = isActive super.init() } // 新增:把对象转成可序列化的字典 func toDictionary() -> [String: Any] { return [ "name": name, "age": age, "isActive": isActive ] } }
然后把数组里的每个MyObject都转成字典,再传给JSONSerialization:
var myList = [MyObject]() // 先往数组里添加一些示例对象 myList.append(MyObject(name: "Alice", age: 25, isActive: true)) myList.append(MyObject(name: "Bob", age: 30, isActive: false)) // 将自定义对象数组转为字典数组 let dictArray = myList.map { $0.toDictionary() } do { // 现在可以正常序列化了 let jsonData = try JSONSerialization.data(withJSONObject: dictArray, options: .prettyPrinted) // 如果需要查看JSON字符串结果 if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) } } catch { // 捕获错误,避免崩溃同时排查问题 print("转JSON失败:\(error.localizedDescription)") }
方案2:升级到Swift4+后用Codable协议(更简洁)
如果你的项目允许升级到Swift4及以上版本,Codable协议会让这个过程变得异常简单——只需要让你的MyObject遵循Codable即可,不需要手动写转字典的代码:
// Swift4+ 适用 struct MyObject: Codable { var name: String var age: Int var isActive: Bool } // 序列化自定义对象数组 do { let jsonData = try JSONEncoder().encode(myList) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) } } catch { print("转JSON失败:\(error.localizedDescription)") }
额外注意点
- 如果你的
MyObject里有可选属性、日期或者其他复杂类型,手动转字典时要额外处理:比如可选值要判断是否为nil,日期要转成字符串或时间戳; - 一定要用
do-catch包裹序列化代码,这样即使转换失败也不会崩溃,还能拿到具体的错误信息; - 确保转成的字典里所有值都是Foundation原生类型,不能嵌套自定义对象,否则还是会崩溃。
内容的提问来源于stack exchange,提问作者Vitaly
相关产品推荐
相关产品推荐

