自分のオブジェクトのコレクションをNSDictionary(JSON用)に深く解析しようとしています。
すべてのモデルが拡張する基本オブジェクトクラスがあり、この基本オブジェクトはNSObjectを拡張します。
@interface BaseObj : NSObject <DICTMaker>
- (NSMutableDictionary *) toDICT;
@end
このメソッドでは、objc-runtimeを使用してプロパティのリストを取得します。を使用して参照を取得できるプロパティはすべて[self valueForKey:]
、先に進んで、プロパティの名前と値を辞書に挿入します。
ただし、これまでに気付いたのは、NSNumber
sとユーザー定義のクラスが辞書に追加されていないことです。私のパーサーは、すべてをログに吐き出しているので、最も確実にそれらを識別します。ただし、すべてのユーザー定義オブジェクトを[self valueForKey:]
返します。nil
NSNumbers
- (NSMutableDictionary *)toDICT {
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];
// Both of these work, I promise:
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
NSString *propertyType = [NSString stringWithUTF8String:getPropertyType(property)];
NSLog( @"%@ of Type: %@", propertyName, propertyType );
id propertyValue = [self valueForKey:propertyName];
if ( [ propertyValue respondsToSelector:@selector(toDICT:) ] )
[ props setObject:[propertyValue toDICT] forKey:propertyName ];
else if ( propertyValue )
[ props setObject:propertyValue forKey:propertyName ];
else
NSLog( @"Unable to get ref to: %@", propertyName );
}
free(properties);
return props;
}
これが私が作成者に投げたサンプルオブジェクトです:
@interface UserRegistrationLocation : BaseObj {
NSString *address, *street, *street_2, *city;
NSNumber *addr_state, *addr_zip;
}
@interface UserRegistrationContact : BaseObj {
NSString *first_name, *last_name;
NSString *p_phone_area, *p_phone_first_3, *p_phone_last_4;
NSString *s_phone_area, *s_phone_first_3, *s_phone_last_4;
}
@interface UserRegistration : BaseObj {
NSString *email, *password, *password_confirm;
NSNumber *referral;
UserRegistrationContact *primary, *secondary;
UserRegistrationLocation *address;
}
NSMutableDictionary *mydict = [myUserRegistration toDICT];
結果の辞書には、email、password、およびpassword_confirmのエントリのみが含まれていました。
[11012:f803] Unable to get ref to: referral
[11012:f803] Unable to get ref to: primary
[11012:f803] Unable to get ref to: secondary
[11012:f803] Unable to get ref to: address
[11012:f803] {"user":{"password":"haxme123","password_confirm":"haxme123","email":"my@email.com"}}
助けてください=}!