|
@@ -18,20 +18,32 @@
|
|
|
|
|
|
@implementation NSObject (MJKeyValue)
|
|
@implementation NSObject (MJKeyValue)
|
|
|
|
|
|
|
|
+#pragma mark - 错误
|
|
|
|
+static const char MJErrorKey = '\0';
|
|
|
|
++ (NSError *)mj_error
|
|
|
|
+{
|
|
|
|
+ return objc_getAssociatedObject(self, &MJErrorKey);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (void)setMj_error:(NSError *)error
|
|
|
|
+{
|
|
|
|
+ objc_setAssociatedObject(self, &MJErrorKey, error, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
|
|
|
+}
|
|
|
|
+
|
|
#pragma mark - 模型 -> 字典时的参考
|
|
#pragma mark - 模型 -> 字典时的参考
|
|
/** 模型转字典时,字典的key是否参考replacedKeyFromPropertyName等方法(父类设置了,子类也会继承下来) */
|
|
/** 模型转字典时,字典的key是否参考replacedKeyFromPropertyName等方法(父类设置了,子类也会继承下来) */
|
|
static const char MJReferenceReplacedKeyWhenCreatingKeyValuesKey = '\0';
|
|
static const char MJReferenceReplacedKeyWhenCreatingKeyValuesKey = '\0';
|
|
|
|
|
|
-+ (void)referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference
|
|
|
|
|
|
++ (void)mj_referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference
|
|
{
|
|
{
|
|
objc_setAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey, @(reference), OBJC_ASSOCIATION_ASSIGN);
|
|
objc_setAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey, @(reference), OBJC_ASSOCIATION_ASSIGN);
|
|
}
|
|
}
|
|
|
|
|
|
-+ (BOOL)isReferenceReplacedKeyWhenCreatingKeyValues
|
|
|
|
|
|
++ (BOOL)mj_isReferenceReplacedKeyWhenCreatingKeyValues
|
|
{
|
|
{
|
|
__block id value = objc_getAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey);
|
|
__block id value = objc_getAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey);
|
|
if (!value) {
|
|
if (!value) {
|
|
- [self enumerateAllClasses:^(__unsafe_unretained Class c, BOOL *stop) {
|
|
|
|
|
|
+ [self mj_enumerateAllClasses:^(__unsafe_unretained Class c, BOOL *stop) {
|
|
value = objc_getAssociatedObject(c, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey);
|
|
value = objc_getAssociatedObject(c, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey);
|
|
|
|
|
|
if (value) *stop = YES;
|
|
if (value) *stop = YES;
|
|
@@ -45,49 +57,42 @@ static NSNumberFormatter *numberFormatter_;
|
|
+ (void)load
|
|
+ (void)load
|
|
{
|
|
{
|
|
numberFormatter_ = [[NSNumberFormatter alloc] init];
|
|
numberFormatter_ = [[NSNumberFormatter alloc] init];
|
|
|
|
+
|
|
|
|
+ // 默认设置
|
|
|
|
+ [self mj_referenceReplacedKeyWhenCreatingKeyValues:YES];
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - --公共方法--
|
|
#pragma mark - --公共方法--
|
|
#pragma mark - 字典 -> 模型
|
|
#pragma mark - 字典 -> 模型
|
|
-- (instancetype)setKeyValues:(id)keyValues
|
|
|
|
-{
|
|
|
|
- return [self setKeyValues:keyValues error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (instancetype)setKeyValues:(id)keyValues error:(NSError *__autoreleasing *)error
|
|
|
|
-{
|
|
|
|
- return [self setKeyValues:keyValues context:nil error:error];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
|
|
|
|
|
|
+- (instancetype)mj_setKeyValues:(id)keyValues
|
|
{
|
|
{
|
|
- return [self setKeyValues:keyValues context:context error:nil];
|
|
|
|
|
|
+ return [self mj_setKeyValues:keyValues context:nil];
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
核心代码:
|
|
核心代码:
|
|
*/
|
|
*/
|
|
-- (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
+- (instancetype)mj_setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
|
|
{
|
|
{
|
|
// 获得JSON对象
|
|
// 获得JSON对象
|
|
- keyValues = [keyValues JSONObject];
|
|
|
|
|
|
+ keyValues = [keyValues mj_JSONObject];
|
|
|
|
|
|
- MJExtensionAssertError([keyValues isKindOfClass:[NSDictionary class]], self, error, @"keyValues参数不是一个字典");
|
|
|
|
|
|
+ MJExtensionAssertError([keyValues isKindOfClass:[NSDictionary class]], self, [self class], @"keyValues参数不是一个字典");
|
|
|
|
|
|
- @try {
|
|
|
|
- Class aClass = [self class];
|
|
|
|
- NSArray *allowedPropertyNames = [aClass totalAllowedPropertyNames];
|
|
|
|
- NSArray *ignoredPropertyNames = [aClass totalIgnoredPropertyNames];
|
|
|
|
-
|
|
|
|
- //通过封装的方法回调一个通过运行时编写的,用于返回属性列表的方法。
|
|
|
|
- [aClass enumerateProperties:^(MJProperty *property, BOOL *stop) {
|
|
|
|
|
|
+ Class clazz = [self class];
|
|
|
|
+ NSArray *allowedPropertyNames = [clazz mj_totalAllowedPropertyNames];
|
|
|
|
+ NSArray *ignoredPropertyNames = [clazz mj_totalIgnoredPropertyNames];
|
|
|
|
+
|
|
|
|
+ //通过封装的方法回调一个通过运行时编写的,用于返回属性列表的方法。
|
|
|
|
+ [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {
|
|
|
|
+ @try {
|
|
// 0.检测是否被忽略
|
|
// 0.检测是否被忽略
|
|
if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
|
|
if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
|
|
if ([ignoredPropertyNames containsObject:property.name]) return;
|
|
if ([ignoredPropertyNames containsObject:property.name]) return;
|
|
|
|
|
|
// 1.取出属性值
|
|
// 1.取出属性值
|
|
id value;
|
|
id value;
|
|
- NSArray *propertyKeyses = [property propertyKeysForClass:aClass];
|
|
|
|
|
|
+ NSArray *propertyKeyses = [property propertyKeysForClass:clazz];
|
|
for (NSArray *propertyKeys in propertyKeyses) {
|
|
for (NSArray *propertyKeys in propertyKeyses) {
|
|
value = keyValues;
|
|
value = keyValues;
|
|
for (MJPropertyKey *propertyKey in propertyKeys) {
|
|
for (MJPropertyKey *propertyKey in propertyKeys) {
|
|
@@ -97,163 +102,162 @@ static NSNumberFormatter *numberFormatter_;
|
|
}
|
|
}
|
|
|
|
|
|
// 值的过滤
|
|
// 值的过滤
|
|
- id newValue = [aClass getNewValueFromObject:self oldValue:value property:property];
|
|
|
|
- if (newValue) value = newValue;
|
|
|
|
|
|
+ id newValue = [clazz mj_getNewValueFromObject:self oldValue:value property:property];
|
|
|
|
+ if (newValue != value) { // 有过滤后的新值
|
|
|
|
+ [property setValue:newValue forObject:self];
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
// 如果没有值,就直接返回
|
|
// 如果没有值,就直接返回
|
|
if (!value || value == [NSNull null]) return;
|
|
if (!value || value == [NSNull null]) return;
|
|
|
|
|
|
- // 2.如果是模型属性
|
|
|
|
|
|
+ // 2.复杂处理
|
|
MJPropertyType *type = property.type;
|
|
MJPropertyType *type = property.type;
|
|
- Class typeClass = type.typeClass;
|
|
|
|
|
|
+ Class propertyClass = type.typeClass;
|
|
Class objectClass = [property objectClassInArrayForClass:[self class]];
|
|
Class objectClass = [property objectClassInArrayForClass:[self class]];
|
|
- if (!type.isFromFoundation && typeClass) {
|
|
|
|
- value = [typeClass objectWithKeyValues:value context:context error:error];
|
|
|
|
|
|
+
|
|
|
|
+ // 不可变 -> 可变处理
|
|
|
|
+ if (propertyClass == [NSMutableArray class] && [value isKindOfClass:[NSArray class]]) {
|
|
|
|
+ value = [NSMutableArray arrayWithArray:value];
|
|
|
|
+ } else if (propertyClass == [NSMutableDictionary class] && [value isKindOfClass:[NSDictionary class]]) {
|
|
|
|
+ value = [NSMutableDictionary dictionaryWithDictionary:value];
|
|
|
|
+ } else if (propertyClass == [NSMutableString class] && [value isKindOfClass:[NSString class]]) {
|
|
|
|
+ value = [NSMutableString stringWithString:value];
|
|
|
|
+ } else if (propertyClass == [NSMutableData class] && [value isKindOfClass:[NSData class]]) {
|
|
|
|
+ value = [NSMutableData dataWithData:value];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!type.isFromFoundation && propertyClass) { // 模型属性
|
|
|
|
+ value = [propertyClass mj_objectWithKeyValues:value context:context];
|
|
} else if (objectClass) {
|
|
} else if (objectClass) {
|
|
- // string array -> url array
|
|
|
|
if (objectClass == [NSURL class] && [value isKindOfClass:[NSArray class]]) {
|
|
if (objectClass == [NSURL class] && [value isKindOfClass:[NSArray class]]) {
|
|
|
|
+ // string array -> url array
|
|
NSMutableArray *urlArray = [NSMutableArray array];
|
|
NSMutableArray *urlArray = [NSMutableArray array];
|
|
for (NSString *string in value) {
|
|
for (NSString *string in value) {
|
|
if (![string isKindOfClass:[NSString class]]) continue;
|
|
if (![string isKindOfClass:[NSString class]]) continue;
|
|
- [urlArray addObject:string.url];
|
|
|
|
|
|
+ [urlArray addObject:string.mj_url];
|
|
}
|
|
}
|
|
value = urlArray;
|
|
value = urlArray;
|
|
- } else {
|
|
|
|
- // 3.字典数组-->模型数组
|
|
|
|
- value = [objectClass objectArrayWithKeyValuesArray:value context:context error:error];
|
|
|
|
|
|
+ } else { // 字典数组-->模型数组
|
|
|
|
+ value = [objectClass mj_objectArrayWithKeyValuesArray:value context:context];
|
|
}
|
|
}
|
|
- } else if (typeClass == [NSString class]) {
|
|
|
|
- if ([value isKindOfClass:[NSNumber class]]) {
|
|
|
|
- // NSNumber -> NSString
|
|
|
|
- value = [value description];
|
|
|
|
- } else if ([value isKindOfClass:[NSURL class]]) {
|
|
|
|
- // NSURL -> NSString
|
|
|
|
- value = [value absoluteString];
|
|
|
|
- }
|
|
|
|
- } else if ([value isKindOfClass:[NSString class]]) {
|
|
|
|
- if (typeClass == [NSURL class]) {
|
|
|
|
- // NSString -> NSURL
|
|
|
|
- // 字符串转码
|
|
|
|
- value = [value url];
|
|
|
|
- } else if (type.isNumberType) {
|
|
|
|
- NSString *oldValue = value;
|
|
|
|
-
|
|
|
|
- // NSString -> NSNumber
|
|
|
|
- value = [numberFormatter_ numberFromString:oldValue];
|
|
|
|
-
|
|
|
|
- // 如果是BOOL
|
|
|
|
- if (type.isBoolType) {
|
|
|
|
- // 字符串转BOOL(字符串没有charValue方法)
|
|
|
|
- // 系统会调用字符串的charValue转为BOOL类型
|
|
|
|
- NSString *lower = [oldValue lowercaseString];
|
|
|
|
- if ([lower isEqualToString:@"yes"] || [lower isEqualToString:@"true"]) {
|
|
|
|
- value = @YES;
|
|
|
|
- } else if ([lower isEqualToString:@"no"] || [lower isEqualToString:@"false"]) {
|
|
|
|
- value = @NO;
|
|
|
|
|
|
+ } else {
|
|
|
|
+ if (propertyClass == [NSString class]) {
|
|
|
|
+ if ([value isKindOfClass:[NSNumber class]]) {
|
|
|
|
+ // NSNumber -> NSString
|
|
|
|
+ value = [value description];
|
|
|
|
+ } else if ([value isKindOfClass:[NSURL class]]) {
|
|
|
|
+ // NSURL -> NSString
|
|
|
|
+ value = [value absoluteString];
|
|
|
|
+ }
|
|
|
|
+ } else if ([value isKindOfClass:[NSString class]]) {
|
|
|
|
+ if (propertyClass == [NSURL class]) {
|
|
|
|
+ // NSString -> NSURL
|
|
|
|
+ // 字符串转码
|
|
|
|
+ value = [value mj_url];
|
|
|
|
+ } else if (type.isNumberType) {
|
|
|
|
+ NSString *oldValue = value;
|
|
|
|
+
|
|
|
|
+ // NSString -> NSNumber
|
|
|
|
+ if (type.class == [NSDecimalNumber class]) {
|
|
|
|
+ value = [NSDecimalNumber decimalNumberWithString:oldValue];
|
|
|
|
+ } else {
|
|
|
|
+ value = [numberFormatter_ numberFromString:oldValue];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 如果是BOOL
|
|
|
|
+ if (type.isBoolType) {
|
|
|
|
+ // 字符串转BOOL(字符串没有charValue方法)
|
|
|
|
+ // 系统会调用字符串的charValue转为BOOL类型
|
|
|
|
+ NSString *lower = [oldValue lowercaseString];
|
|
|
|
+ if ([lower isEqualToString:@"yes"] || [lower isEqualToString:@"true"]) {
|
|
|
|
+ value = @YES;
|
|
|
|
+ } else if ([lower isEqualToString:@"no"] || [lower isEqualToString:@"false"]) {
|
|
|
|
+ value = @NO;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // value和property类型不匹配
|
|
|
|
+ if (propertyClass && ![value isKindOfClass:propertyClass]) {
|
|
|
|
+ value = nil;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
- // 4.赋值
|
|
|
|
|
|
+ // 3.赋值
|
|
[property setValue:value forObject:self];
|
|
[property setValue:value forObject:self];
|
|
- }];
|
|
|
|
-
|
|
|
|
- // 转换完毕
|
|
|
|
- if ([self respondsToSelector:@selector(keyValuesDidFinishConvertingToObject)]) {
|
|
|
|
- [self keyValuesDidFinishConvertingToObject];
|
|
|
|
|
|
+ } @catch (NSException *exception) {
|
|
|
|
+ MJExtensionBuildError([self class], exception.reason);
|
|
|
|
+ MJExtensionLog(@"%@", exception);
|
|
}
|
|
}
|
|
- } @catch (NSException *exception) {
|
|
|
|
- MJExtensionBuildError(error, exception.reason);
|
|
|
|
- NSLog(@"%@", exception);
|
|
|
|
|
|
+ }];
|
|
|
|
+
|
|
|
|
+ // 转换完毕
|
|
|
|
+ if ([self respondsToSelector:@selector(mj_keyValuesDidFinishConvertingToObject)]) {
|
|
|
|
+ [self mj_keyValuesDidFinishConvertingToObject];
|
|
}
|
|
}
|
|
return self;
|
|
return self;
|
|
}
|
|
}
|
|
|
|
|
|
-+ (instancetype)objectWithKeyValues:(id)keyValues
|
|
|
|
-{
|
|
|
|
- return [self objectWithKeyValues:keyValues error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (instancetype)objectWithKeyValues:(id)keyValues error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (instancetype)mj_objectWithKeyValues:(id)keyValues
|
|
{
|
|
{
|
|
- return [self objectWithKeyValues:keyValues context:nil error:error];
|
|
|
|
|
|
+ return [self mj_objectWithKeyValues:keyValues context:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
|
|
|
|
-{
|
|
|
|
- return [self objectWithKeyValues:keyValues context:context error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (instancetype)mj_objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
|
|
{
|
|
{
|
|
- if (keyValues == nil) return nil;
|
|
|
|
|
|
+ // 获得JSON对象
|
|
|
|
+ keyValues = [keyValues mj_JSONObject];
|
|
|
|
+ MJExtensionAssertError([keyValues isKindOfClass:[NSDictionary class]], nil, [self class], @"keyValues参数不是一个字典");
|
|
|
|
+
|
|
if ([self isSubclassOfClass:[NSManagedObject class]] && context) {
|
|
if ([self isSubclassOfClass:[NSManagedObject class]] && context) {
|
|
- return [[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass(self) inManagedObjectContext:context] setKeyValues:keyValues context:context error:error];
|
|
|
|
|
|
+ return [[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass(self) inManagedObjectContext:context] mj_setKeyValues:keyValues context:context];
|
|
}
|
|
}
|
|
- return [[[self alloc] init] setKeyValues:keyValues error:error];
|
|
|
|
|
|
+ return [[[self alloc] init] mj_setKeyValues:keyValues];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (instancetype)objectWithFilename:(NSString *)filename
|
|
|
|
|
|
++ (instancetype)mj_objectWithFilename:(NSString *)filename
|
|
{
|
|
{
|
|
- return [self objectWithFilename:filename error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (instancetype)objectWithFilename:(NSString *)filename error:(NSError *__autoreleasing *)error
|
|
|
|
-{
|
|
|
|
- MJExtensionAssertError(filename != nil, nil, error, @"filename参数为nil");
|
|
|
|
|
|
+ MJExtensionAssertError(filename != nil, nil, [self class], @"filename参数为nil");
|
|
|
|
|
|
- return [self objectWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil] error:error];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (instancetype)objectWithFile:(NSString *)file
|
|
|
|
-{
|
|
|
|
- return [self objectWithFile:file error:nil];
|
|
|
|
|
|
+ return [self mj_objectWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (instancetype)objectWithFile:(NSString *)file error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (instancetype)mj_objectWithFile:(NSString *)file
|
|
{
|
|
{
|
|
- MJExtensionAssertError(file != nil, nil, error, @"file参数为nil");
|
|
|
|
|
|
+ MJExtensionAssertError(file != nil, nil, [self class], @"file参数为nil");
|
|
|
|
|
|
- return [self objectWithKeyValues:[NSDictionary dictionaryWithContentsOfFile:file] error:error];
|
|
|
|
|
|
+ return [self mj_objectWithKeyValues:[NSDictionary dictionaryWithContentsOfFile:file]];
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - 字典数组 -> 模型数组
|
|
#pragma mark - 字典数组 -> 模型数组
|
|
-+ (NSMutableArray *)objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
|
|
|
|
|
|
++ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
|
|
{
|
|
{
|
|
- return [self objectArrayWithKeyValuesArray:keyValuesArray error:nil];
|
|
|
|
|
|
+ return [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (NSMutableArray *)objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
|
|
{
|
|
{
|
|
- return [self objectArrayWithKeyValuesArray:keyValuesArray context:nil error:error];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
|
|
|
|
-{
|
|
|
|
- return [self objectArrayWithKeyValuesArray:keyValuesArray context:context error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context error:(NSError *__autoreleasing *)error
|
|
|
|
-{
|
|
|
|
- // 如果数组里面放的是NSString、NSNumber等数据
|
|
|
|
- if ([MJFoundation isClassFromFoundation:self]) return keyValuesArray;
|
|
|
|
-
|
|
|
|
// 如果是JSON字符串
|
|
// 如果是JSON字符串
|
|
- keyValuesArray = [keyValuesArray JSONObject];
|
|
|
|
|
|
+ keyValuesArray = [keyValuesArray mj_JSONObject];
|
|
|
|
|
|
// 1.判断真实性
|
|
// 1.判断真实性
|
|
- MJExtensionAssertError([keyValuesArray isKindOfClass:[NSArray class]], nil, error, @"keyValuesArray参数不是一个数组");
|
|
|
|
|
|
+ MJExtensionAssertError([keyValuesArray isKindOfClass:[NSArray class]], nil, [self class], @"keyValuesArray参数不是一个数组");
|
|
|
|
|
|
|
|
+ // 如果数组里面放的是NSString、NSNumber等数据
|
|
|
|
+ if ([MJFoundation isClassFromFoundation:self]) return [NSMutableArray arrayWithArray:keyValuesArray];
|
|
|
|
+
|
|
|
|
+
|
|
// 2.创建数组
|
|
// 2.创建数组
|
|
NSMutableArray *modelArray = [NSMutableArray array];
|
|
NSMutableArray *modelArray = [NSMutableArray array];
|
|
|
|
|
|
// 3.遍历
|
|
// 3.遍历
|
|
for (NSDictionary *keyValues in keyValuesArray) {
|
|
for (NSDictionary *keyValues in keyValuesArray) {
|
|
if ([keyValues isKindOfClass:[NSArray class]]){
|
|
if ([keyValues isKindOfClass:[NSArray class]]){
|
|
- [modelArray addObject:[self objectArrayWithKeyValuesArray:keyValues context:context error:error]];
|
|
|
|
|
|
+ [modelArray addObject:[self mj_objectArrayWithKeyValuesArray:keyValues context:context]];
|
|
} else {
|
|
} else {
|
|
- id model = [self objectWithKeyValues:keyValues context:context error:error];
|
|
|
|
|
|
+ id model = [self mj_objectWithKeyValues:keyValues context:context];
|
|
if (model) [modelArray addObject:model];
|
|
if (model) [modelArray addObject:model];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -261,74 +265,49 @@ static NSNumberFormatter *numberFormatter_;
|
|
return modelArray;
|
|
return modelArray;
|
|
}
|
|
}
|
|
|
|
|
|
-+ (NSMutableArray *)objectArrayWithFilename:(NSString *)filename
|
|
|
|
-{
|
|
|
|
- return [self objectArrayWithFilename:filename error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)objectArrayWithFilename:(NSString *)filename error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_objectArrayWithFilename:(NSString *)filename
|
|
{
|
|
{
|
|
- MJExtensionAssertError(filename != nil, nil, error, @"filename参数为nil");
|
|
|
|
|
|
+ MJExtensionAssertError(filename != nil, nil, [self class], @"filename参数为nil");
|
|
|
|
|
|
- return [self objectArrayWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil] error:error];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)objectArrayWithFile:(NSString *)file
|
|
|
|
-{
|
|
|
|
- return [self objectArrayWithFile:file error:nil];
|
|
|
|
|
|
+ return [self mj_objectArrayWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (NSMutableArray *)objectArrayWithFile:(NSString *)file error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_objectArrayWithFile:(NSString *)file
|
|
{
|
|
{
|
|
- MJExtensionAssertError(file != nil, nil, error, @"file参数为nil");
|
|
|
|
|
|
+ MJExtensionAssertError(file != nil, nil, [self class], @"file参数为nil");
|
|
|
|
|
|
- return [self objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:file] error:error];
|
|
|
|
|
|
+ return [self mj_objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:file]];
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - 模型 -> 字典
|
|
#pragma mark - 模型 -> 字典
|
|
-- (NSMutableDictionary *)keyValues
|
|
|
|
|
|
+- (NSMutableDictionary *)mj_keyValues
|
|
{
|
|
{
|
|
- return [self keyValuesWithError:nil];
|
|
|
|
|
|
+ return [self mj_keyValuesWithKeys:nil ignoredKeys:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-- (NSMutableDictionary *)keyValuesWithError:(NSError *__autoreleasing *)error
|
|
|
|
|
|
+- (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys
|
|
{
|
|
{
|
|
- return [self keyValuesWithIgnoredKeys:nil error:error];
|
|
|
|
|
|
+ return [self mj_keyValuesWithKeys:keys ignoredKeys:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-- (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys
|
|
|
|
|
|
+- (NSMutableDictionary *)mj_keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
|
|
{
|
|
{
|
|
- return [self keyValuesWithKeys:keys error:nil];
|
|
|
|
|
|
+ return [self mj_keyValuesWithKeys:nil ignoredKeys:ignoredKeys];
|
|
}
|
|
}
|
|
|
|
|
|
-- (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
+- (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys
|
|
{
|
|
{
|
|
- return [self keyValuesWithKeys:keys ignoredKeys:nil error:error];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
|
|
|
|
-{
|
|
|
|
- return [self keyValuesWithIgnoredKeys:ignoredKeys error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys error:(NSError *__autoreleasing *)error
|
|
|
|
-{
|
|
|
|
- return [self keyValuesWithKeys:nil ignoredKeys:ignoredKeys error:error];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys error:(NSError *__autoreleasing *)error
|
|
|
|
-{
|
|
|
|
- // 如果自己不是模型类
|
|
|
|
- if ([MJFoundation isClassFromFoundation:[self class]]) return (NSMutableDictionary *)self;
|
|
|
|
|
|
+ // 如果自己不是模型类, 那就返回自己
|
|
|
|
+ MJExtensionAssertError(![MJFoundation isClassFromFoundation:[self class]], (NSMutableDictionary *)self, [self class], @"不是自定义的模型类")
|
|
|
|
|
|
id keyValues = [NSMutableDictionary dictionary];
|
|
id keyValues = [NSMutableDictionary dictionary];
|
|
|
|
|
|
- @try {
|
|
|
|
- Class aClass = [self class];
|
|
|
|
- NSArray *allowedPropertyNames = [aClass totalAllowedPropertyNames];
|
|
|
|
- NSArray *ignoredPropertyNames = [aClass totalIgnoredPropertyNames];
|
|
|
|
-
|
|
|
|
- [aClass enumerateProperties:^(MJProperty *property, BOOL *stop) {
|
|
|
|
|
|
+ Class clazz = [self class];
|
|
|
|
+ NSArray *allowedPropertyNames = [clazz mj_totalAllowedPropertyNames];
|
|
|
|
+ NSArray *ignoredPropertyNames = [clazz mj_totalIgnoredPropertyNames];
|
|
|
|
+
|
|
|
|
+ [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {
|
|
|
|
+ @try {
|
|
// 0.检测是否被忽略
|
|
// 0.检测是否被忽略
|
|
if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
|
|
if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
|
|
if ([ignoredPropertyNames containsObject:property.name]) return;
|
|
if ([ignoredPropertyNames containsObject:property.name]) return;
|
|
@@ -341,19 +320,19 @@ static NSNumberFormatter *numberFormatter_;
|
|
|
|
|
|
// 2.如果是模型属性
|
|
// 2.如果是模型属性
|
|
MJPropertyType *type = property.type;
|
|
MJPropertyType *type = property.type;
|
|
- Class typeClass = type.typeClass;
|
|
|
|
- if (!type.isFromFoundation && typeClass) {
|
|
|
|
- value = [value keyValues];
|
|
|
|
|
|
+ Class propertyClass = type.typeClass;
|
|
|
|
+ if (!type.isFromFoundation && propertyClass) {
|
|
|
|
+ value = [value mj_keyValues];
|
|
} else if ([value isKindOfClass:[NSArray class]]) {
|
|
} else if ([value isKindOfClass:[NSArray class]]) {
|
|
// 3.处理数组里面有模型的情况
|
|
// 3.处理数组里面有模型的情况
|
|
- value = [NSObject keyValuesArrayWithObjectArray:value];
|
|
|
|
- } else if (typeClass == [NSURL class]) {
|
|
|
|
|
|
+ value = [NSObject mj_keyValuesArrayWithObjectArray:value];
|
|
|
|
+ } else if (propertyClass == [NSURL class]) {
|
|
value = [value absoluteString];
|
|
value = [value absoluteString];
|
|
}
|
|
}
|
|
|
|
|
|
// 4.赋值
|
|
// 4.赋值
|
|
- if ([aClass isReferenceReplacedKeyWhenCreatingKeyValues]) {
|
|
|
|
- NSArray *propertyKeys = [[property propertyKeysForClass:aClass] firstObject];
|
|
|
|
|
|
+ if ([clazz mj_isReferenceReplacedKeyWhenCreatingKeyValues]) {
|
|
|
|
+ NSArray *propertyKeys = [[property propertyKeysForClass:clazz] firstObject];
|
|
NSUInteger keyCount = propertyKeys.count;
|
|
NSUInteger keyCount = propertyKeys.count;
|
|
// 创建字典
|
|
// 创建字典
|
|
__block id innerContainer = keyValues;
|
|
__block id innerContainer = keyValues;
|
|
@@ -381,9 +360,10 @@ static NSNumberFormatter *numberFormatter_;
|
|
}
|
|
}
|
|
|
|
|
|
if ([tempInnerContainer isKindOfClass:[NSMutableArray class]]) {
|
|
if ([tempInnerContainer isKindOfClass:[NSMutableArray class]]) {
|
|
|
|
+ NSMutableArray *tempInnerContainerArray = tempInnerContainer;
|
|
int index = nextPropertyKey.name.intValue;
|
|
int index = nextPropertyKey.name.intValue;
|
|
- while ([tempInnerContainer count] < index + 1) {
|
|
|
|
- [tempInnerContainer addObject:[NSNull null]];
|
|
|
|
|
|
+ while (tempInnerContainerArray.count < index + 1) {
|
|
|
|
+ [tempInnerContainerArray addObject:[NSNull null]];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -399,74 +379,54 @@ static NSNumberFormatter *numberFormatter_;
|
|
} else {
|
|
} else {
|
|
keyValues[property.name] = value;
|
|
keyValues[property.name] = value;
|
|
}
|
|
}
|
|
- }];
|
|
|
|
-
|
|
|
|
- // 去除系统自动增加的元素
|
|
|
|
- if ([keyValues isKindOfClass:[NSMutableDictionary class]]) {
|
|
|
|
- [keyValues removeObjectsForKeys:@[@"superclass", @"debugDescription", @"description", @"hash"]];
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 转换完毕
|
|
|
|
- if ([self respondsToSelector:@selector(objectDidFinishConvertingToKeyValues)]) {
|
|
|
|
- [self objectDidFinishConvertingToKeyValues];
|
|
|
|
|
|
+ } @catch (NSException *exception) {
|
|
|
|
+ MJExtensionBuildError([self class], exception.reason);
|
|
|
|
+ MJExtensionLog(@"%@", exception);
|
|
}
|
|
}
|
|
- } @catch (NSException *exception) {
|
|
|
|
- MJExtensionBuildError(error, exception.reason);
|
|
|
|
- NSLog(@"%@", exception);
|
|
|
|
|
|
+ }];
|
|
|
|
+
|
|
|
|
+ // 转换完毕
|
|
|
|
+ if ([self respondsToSelector:@selector(mj_objectDidFinishConvertingToKeyValues)]) {
|
|
|
|
+ [self mj_objectDidFinishConvertingToKeyValues];
|
|
}
|
|
}
|
|
|
|
|
|
return keyValues;
|
|
return keyValues;
|
|
}
|
|
}
|
|
#pragma mark - 模型数组 -> 字典数组
|
|
#pragma mark - 模型数组 -> 字典数组
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray
|
|
|
|
-{
|
|
|
|
- return [self keyValuesArrayWithObjectArray:objectArray error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray
|
|
{
|
|
{
|
|
- return [self keyValuesArrayWithObjectArray:objectArray ignoredKeys:nil error:error];
|
|
|
|
|
|
+ return [self mj_keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
|
|
|
|
-{
|
|
|
|
- return [self keyValuesArrayWithObjectArray:objectArray keys:keys error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
|
|
|
|
-{
|
|
|
|
- return [self keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys error:nil];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
|
|
{
|
|
{
|
|
- return [self keyValuesArrayWithObjectArray:objectArray keys:keys ignoredKeys:nil error:error];
|
|
|
|
|
|
+ return [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys ignoredKeys:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
|
|
{
|
|
{
|
|
- return [self keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:ignoredKeys error:error];
|
|
|
|
|
|
+ return [self mj_keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:ignoredKeys];
|
|
}
|
|
}
|
|
|
|
|
|
-+ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys error:(NSError *__autoreleasing *)error
|
|
|
|
|
|
++ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys
|
|
{
|
|
{
|
|
// 0.判断真实性
|
|
// 0.判断真实性
|
|
- MJExtensionAssertError([objectArray isKindOfClass:[NSArray class]], nil, error, @"objectArray参数不是一个数组");
|
|
|
|
|
|
+ MJExtensionAssertError([objectArray isKindOfClass:[NSArray class]], nil, [self class], @"objectArray参数不是一个数组");
|
|
|
|
|
|
// 1.创建数组
|
|
// 1.创建数组
|
|
NSMutableArray *keyValuesArray = [NSMutableArray array];
|
|
NSMutableArray *keyValuesArray = [NSMutableArray array];
|
|
for (id object in objectArray) {
|
|
for (id object in objectArray) {
|
|
if (keys) {
|
|
if (keys) {
|
|
- [keyValuesArray addObject:[object keyValuesWithKeys:keys error:error]];
|
|
|
|
|
|
+ [keyValuesArray addObject:[object mj_keyValuesWithKeys:keys]];
|
|
} else {
|
|
} else {
|
|
- [keyValuesArray addObject:[object keyValuesWithIgnoredKeys:ignoredKeys error:error]];
|
|
|
|
|
|
+ [keyValuesArray addObject:[object mj_keyValuesWithIgnoredKeys:ignoredKeys]];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return keyValuesArray;
|
|
return keyValuesArray;
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - 转换为JSON
|
|
#pragma mark - 转换为JSON
|
|
-- (NSData *)JSONData
|
|
|
|
|
|
+- (NSData *)mj_JSONData
|
|
{
|
|
{
|
|
if ([self isKindOfClass:[NSString class]]) {
|
|
if ([self isKindOfClass:[NSString class]]) {
|
|
return [((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding];
|
|
return [((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding];
|
|
@@ -474,10 +434,10 @@ static NSNumberFormatter *numberFormatter_;
|
|
return (NSData *)self;
|
|
return (NSData *)self;
|
|
}
|
|
}
|
|
|
|
|
|
- return [NSJSONSerialization dataWithJSONObject:[self JSONObject] options:kNilOptions error:nil];
|
|
|
|
|
|
+ return [NSJSONSerialization dataWithJSONObject:[self mj_JSONObject] options:kNilOptions error:nil];
|
|
}
|
|
}
|
|
|
|
|
|
-- (id)JSONObject
|
|
|
|
|
|
+- (id)mj_JSONObject
|
|
{
|
|
{
|
|
if ([self isKindOfClass:[NSString class]]) {
|
|
if ([self isKindOfClass:[NSString class]]) {
|
|
return [NSJSONSerialization JSONObjectWithData:[((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
|
|
return [NSJSONSerialization JSONObjectWithData:[((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
|
|
@@ -485,10 +445,10 @@ static NSNumberFormatter *numberFormatter_;
|
|
return [NSJSONSerialization JSONObjectWithData:(NSData *)self options:kNilOptions error:nil];
|
|
return [NSJSONSerialization JSONObjectWithData:(NSData *)self options:kNilOptions error:nil];
|
|
}
|
|
}
|
|
|
|
|
|
- return self.keyValues;
|
|
|
|
|
|
+ return self.mj_keyValues;
|
|
}
|
|
}
|
|
|
|
|
|
-- (NSString *)JSONString
|
|
|
|
|
|
+- (NSString *)mj_JSONString
|
|
{
|
|
{
|
|
if ([self isKindOfClass:[NSString class]]) {
|
|
if ([self isKindOfClass:[NSString class]]) {
|
|
return (NSString *)self;
|
|
return (NSString *)self;
|
|
@@ -496,6 +456,253 @@ static NSNumberFormatter *numberFormatter_;
|
|
return [[NSString alloc] initWithData:(NSData *)self encoding:NSUTF8StringEncoding];
|
|
return [[NSString alloc] initWithData:(NSData *)self encoding:NSUTF8StringEncoding];
|
|
}
|
|
}
|
|
|
|
|
|
- return [[NSString alloc] initWithData:[self JSONData] encoding:NSUTF8StringEncoding];
|
|
|
|
|
|
+ return [[NSString alloc] initWithData:[self mj_JSONData] encoding:NSUTF8StringEncoding];
|
|
}
|
|
}
|
|
@end
|
|
@end
|
|
|
|
+
|
|
|
|
+@implementation NSObject (MJKeyValueDeprecated_v_2_5_16)
|
|
|
|
+- (instancetype)setKeyValues:(id)keyValues
|
|
|
|
+{
|
|
|
|
+ return [self mj_setKeyValues:keyValues];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (instancetype)setKeyValues:(id)keyValues error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_setKeyValues:keyValues];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self.class mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
|
|
|
|
+{
|
|
|
|
+ return [self mj_setKeyValues:keyValues context:context];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_setKeyValues:keyValues context:context];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self.class mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (void)referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference
|
|
|
|
+{
|
|
|
|
+ [self mj_referenceReplacedKeyWhenCreatingKeyValues:reference];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSMutableDictionary *)keyValues
|
|
|
|
+{
|
|
|
|
+ return [self mj_keyValues];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSMutableDictionary *)keyValuesWithError:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_keyValues];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self.class mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys
|
|
|
|
+{
|
|
|
|
+ return [self mj_keyValuesWithKeys:keys];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_keyValuesWithKeys:keys];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self.class mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
|
|
|
|
+{
|
|
|
|
+ return [self mj_keyValuesWithIgnoredKeys:ignoredKeys];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_keyValuesWithIgnoredKeys:ignoredKeys];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self.class mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray
|
|
|
|
+{
|
|
|
|
+ return [self mj_keyValuesArrayWithObjectArray:objectArray];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_keyValuesArrayWithObjectArray:objectArray];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
|
|
|
|
+{
|
|
|
|
+ return [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
|
|
|
|
+{
|
|
|
|
+ return [self mj_keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithKeyValues:(id)keyValues
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectWithKeyValues:keyValues];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithKeyValues:(id)keyValues error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectWithKeyValues:keyValues];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectWithKeyValues:keyValues context:context];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectWithKeyValues:keyValues context:context];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithFilename:(NSString *)filename
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectWithFilename:filename];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithFilename:(NSString *)filename error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectWithFilename:filename];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithFile:(NSString *)file
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectWithFile:file];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (instancetype)objectWithFile:(NSString *)file error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectWithFile:file];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectArrayWithKeyValuesArray:keyValuesArray];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectArrayWithKeyValuesArray:keyValuesArray];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:context];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:context];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithFilename:(NSString *)filename
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectArrayWithFilename:filename];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithFilename:(NSString *)filename error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectArrayWithFilename:filename];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithFile:(NSString *)file
|
|
|
|
+{
|
|
|
|
+ return [self mj_objectArrayWithFile:file];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
++ (NSMutableArray *)objectArrayWithFile:(NSString *)file error:(NSError **)error
|
|
|
|
+{
|
|
|
|
+ id value = [self mj_objectArrayWithFile:file];
|
|
|
|
+ if (error != NULL) {
|
|
|
|
+ *error = [self mj_error];
|
|
|
|
+ }
|
|
|
|
+ return value;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSData *)JSONData
|
|
|
|
+{
|
|
|
|
+ return [self mj_JSONData];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (id)JSONObject
|
|
|
|
+{
|
|
|
|
+ return [self mj_JSONObject];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSString *)JSONString
|
|
|
|
+{
|
|
|
|
+ return [self mj_JSONString];
|
|
|
|
+}
|
|
|
|
+@end
|