You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:58