swift (runtime)自定义类转化成字典,Data,JSON字符串

本文介绍了如何使用Swift的runtime特性将自定义类转换为字典、Data对象以及JSON字符串,详细阐述了转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

swift (runtime)自定义类转化成字典,Data,JSON字符串

实现部分
class ObjectPrint: NSObject {
    class func getJSON(obj:AnyObject,options:JSONSerialization.WritingOptions)->Data{
        var data = Data()
        do{
            data = try JSONSerialization.data(withJSONObject: self.getObjectDictionary(obj: obj), options: options)
        }
        catch{

        }
        return data
    }
    class func getObjectDictionary(obj:AnyObject)->NSMutableDictionary{
        let dic = NSMutableDictionary()
        var propsCount:UInt32 = 0
        let props = class_copyPropertyList(obj.classForCoder, &propsCount)
        for i in 0..<propsCount {
            let prop = props?[Int(i)]
            let propName = String.init(utf8String: property_getName(prop))

            var value = obj.value(forKey: propName!)
            if value == nil {
                value = NSNull()
            }else{
                value = self.getObjectInternal(obj: value as AnyObject)
            }
            dic.setValue(value, forKey: propName!)
        }
        return dic
    }

    class func getObjectInternal(obj:AnyObject)->AnyObject{
        if obj.isKind(of: NSString.self) || obj.isKind(of: NSNumber.self) || obj.isKind(of: NSNull.self){
            return obj
        }
        if obj.isKind(of: NSArray.self) {
            let arr = NSArray.init(array: obj as! [Any])
            let objArr = NSMutableArray.init(capacity: arr.count)
            for i in 0..<arr.count {
                objArr[i] = self.getObjectInternal(obj: arr[i] as AnyObject)
            }
            return objArr
        }
        if obj.isKind(of: NSDictionary.self) {
            let dic = NSMutableDictionary.init(capacity: (obj as! NSDictionary).count)
            for key in (obj as! NSDictionary).allKeys {
                dic.setObject(self.getObjectInternal(obj: (obj as! NSDictionary).value(forKey: key as! String) as AnyObject), forKey: key as! NSString)
            }
            return dic
        }
        return self.getObjectDictionary(obj:obj)
    }
}
自定义类
class Person: NSObject {
    var name:String?
    var age:NSNumber?
    var children:NSArray?
    var book:NSDictionary?
}
class Child: NSObject {
    var name:NSString?
    var age:NSNumber?
}

调用
let person = Person()
        person.name = "张三"
        person.age = 40
        person.book = ["first":"we","second":"are"]
        let childOne = Child()
        childOne.name = "ddf"
        childOne.age = 2
        let childTwo = Child()
        childTwo.name = "dfgd"
        childTwo.age = 4
        person.children = NSArray(arrayLiteral: childOne,childTwo)
        //自定义类转化成Data或json字符串
        let jsonData = ObjectPrint.getJSON(obj: person, options: JSONSerialization.WritingOptions.prettyPrinted)
        let jsonText = NSString.init(data: jsonData, encoding: String.Encoding.utf8.rawValue)
        print(jsonText!)
        //自定义类转化成字典
        let dic = ObjectPrint.getObjectDictionary(obj: person)
        print(dic)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值