如何獲取NSObject屬性名和屬性值的字典
2011-03-03 12:04:06
標簽:JSON 自定義對象 休閑 職場
最近在利用SBJSON開發的過程中,發現SBJSON無法支持自定義的對象,為此考慮到了兩種實現方案。一種在SBJSON框架一層實現一個自定義對象的Category以支持proxyForJson的方法。另一種方案就是應用層將自定義對象轉換成屬性名和屬性值的字典后再交由SBJSON處理。鑒于本次SBJSON由一個底層庫維護,折中方案就是在應用層進行自定義對象的處理。經過一番調查和搜索后,發現如下的實現方法:
import <Foundation/Foundation.h>
import <objc/runtime.h>
@interface NSObject (PropertyListing)
// aps suffix to avoid namespace collsion
// ...for Andrew Paul Sardone
- (NSDictionary *)properties_aps;
@end
@implementation NSObject (PropertyListing)
- (NSDictionary *)properties_aps {
NSMutableDictionary *props = [NSMutableDictionary dictionary];
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
NSString *propertyName = [[[NSString alloc] initWithCString:property_getName(property)] autorelease];
id propertyValue = [self valueForKey:(NSString *)propertyName];
if (propertyValue) [props setObject:propertyValue forKey:propertyName];
}
free(properties);
return props;
}
@end
利用一些JSON框架進行自定義對象傳輸時處理如下:
// The Person class has firstName
and lastName
// properties.
// andrew is a Person instance with NSString values
// of "Andrew" and "Sardone" for firstName
and
// lastName
respectively.
NSString *jsonString = [[andrew properties_aps]
JSONRepresentation];
// now jsonString
looks like:
// { "firstName": "Andrew", "lastName": "Sardone" }
代碼鏈接: http://forrst.com/posts/Getting_a_dictionary_of_an_NSObjects_property_n-h2T