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)
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)