NSObject+MJKeyValue.m 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. //
  2. // NSObject+MJKeyValue.m
  3. // MJExtension
  4. //
  5. // Created by mj on 13-8-24.
  6. // Copyright (c) 2013年 小码哥. All rights reserved.
  7. //
  8. #import "NSObject+MJKeyValue.h"
  9. #import "NSObject+MJProperty.h"
  10. #import "NSString+MJExtension.h"
  11. #import "MJProperty.h"
  12. #import "MJPropertyType.h"
  13. #import "MJExtensionConst.h"
  14. #import "MJFoundation.h"
  15. #import "NSString+MJExtension.h"
  16. #import "NSObject+MJClass.h"
  17. @implementation NSObject (MJKeyValue)
  18. #pragma mark - 错误
  19. static const char MJErrorKey = '\0';
  20. + (NSError *)mj_error
  21. {
  22. return objc_getAssociatedObject(self, &MJErrorKey);
  23. }
  24. + (void)setMj_error:(NSError *)error
  25. {
  26. objc_setAssociatedObject(self, &MJErrorKey, error, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  27. }
  28. #pragma mark - 模型 -> 字典时的参考
  29. /** 模型转字典时,字典的key是否参考replacedKeyFromPropertyName等方法(父类设置了,子类也会继承下来) */
  30. static const char MJReferenceReplacedKeyWhenCreatingKeyValuesKey = '\0';
  31. + (void)mj_referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference
  32. {
  33. objc_setAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey, @(reference), OBJC_ASSOCIATION_ASSIGN);
  34. }
  35. + (BOOL)mj_isReferenceReplacedKeyWhenCreatingKeyValues
  36. {
  37. __block id value = objc_getAssociatedObject(self, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey);
  38. if (!value) {
  39. [self mj_enumerateAllClasses:^(__unsafe_unretained Class c, BOOL *stop) {
  40. value = objc_getAssociatedObject(c, &MJReferenceReplacedKeyWhenCreatingKeyValuesKey);
  41. if (value) *stop = YES;
  42. }];
  43. }
  44. return [value boolValue];
  45. }
  46. #pragma mark - --常用的对象--
  47. static NSNumberFormatter *numberFormatter_;
  48. + (void)load
  49. {
  50. numberFormatter_ = [[NSNumberFormatter alloc] init];
  51. // 默认设置
  52. [self mj_referenceReplacedKeyWhenCreatingKeyValues:YES];
  53. }
  54. #pragma mark - --公共方法--
  55. #pragma mark - 字典 -> 模型
  56. - (instancetype)mj_setKeyValues:(id)keyValues
  57. {
  58. return [self mj_setKeyValues:keyValues context:nil];
  59. }
  60. /**
  61. 核心代码:
  62. */
  63. - (instancetype)mj_setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
  64. {
  65. // 获得JSON对象
  66. keyValues = [keyValues mj_JSONObject];
  67. MJExtensionAssertError([keyValues isKindOfClass:[NSDictionary class]], self, [self class], @"keyValues参数不是一个字典");
  68. Class clazz = [self class];
  69. NSArray *allowedPropertyNames = [clazz mj_totalAllowedPropertyNames];
  70. NSArray *ignoredPropertyNames = [clazz mj_totalIgnoredPropertyNames];
  71. //通过封装的方法回调一个通过运行时编写的,用于返回属性列表的方法。
  72. [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {
  73. @try {
  74. // 0.检测是否被忽略
  75. if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
  76. if ([ignoredPropertyNames containsObject:property.name]) return;
  77. // 1.取出属性值
  78. id value;
  79. NSArray *propertyKeyses = [property propertyKeysForClass:clazz];
  80. for (NSArray *propertyKeys in propertyKeyses) {
  81. value = keyValues;
  82. for (MJPropertyKey *propertyKey in propertyKeys) {
  83. value = [propertyKey valueInObject:value];
  84. }
  85. if (value) break;
  86. }
  87. // 值的过滤
  88. id newValue = [clazz mj_getNewValueFromObject:self oldValue:value property:property];
  89. if (newValue != value) { // 有过滤后的新值
  90. [property setValue:newValue forObject:self];
  91. return;
  92. }
  93. // 如果没有值,就直接返回
  94. if (!value || value == [NSNull null]) return;
  95. // 2.复杂处理
  96. MJPropertyType *type = property.type;
  97. Class propertyClass = type.typeClass;
  98. Class objectClass = [property objectClassInArrayForClass:[self class]];
  99. // 不可变 -> 可变处理
  100. if (propertyClass == [NSMutableArray class] && [value isKindOfClass:[NSArray class]]) {
  101. value = [NSMutableArray arrayWithArray:value];
  102. } else if (propertyClass == [NSMutableDictionary class] && [value isKindOfClass:[NSDictionary class]]) {
  103. value = [NSMutableDictionary dictionaryWithDictionary:value];
  104. } else if (propertyClass == [NSMutableString class] && [value isKindOfClass:[NSString class]]) {
  105. value = [NSMutableString stringWithString:value];
  106. } else if (propertyClass == [NSMutableData class] && [value isKindOfClass:[NSData class]]) {
  107. value = [NSMutableData dataWithData:value];
  108. }
  109. if (!type.isFromFoundation && propertyClass) { // 模型属性
  110. value = [propertyClass mj_objectWithKeyValues:value context:context];
  111. } else if (objectClass) {
  112. if (objectClass == [NSURL class] && [value isKindOfClass:[NSArray class]]) {
  113. // string array -> url array
  114. NSMutableArray *urlArray = [NSMutableArray array];
  115. for (NSString *string in value) {
  116. if (![string isKindOfClass:[NSString class]]) continue;
  117. [urlArray addObject:string.mj_url];
  118. }
  119. value = urlArray;
  120. } else { // 字典数组-->模型数组
  121. value = [objectClass mj_objectArrayWithKeyValuesArray:value context:context];
  122. }
  123. } else {
  124. if (propertyClass == [NSString class]) {
  125. if ([value isKindOfClass:[NSNumber class]]) {
  126. // NSNumber -> NSString
  127. value = [value description];
  128. } else if ([value isKindOfClass:[NSURL class]]) {
  129. // NSURL -> NSString
  130. value = [value absoluteString];
  131. }
  132. } else if ([value isKindOfClass:[NSString class]]) {
  133. if (propertyClass == [NSURL class]) {
  134. // NSString -> NSURL
  135. // 字符串转码
  136. value = [value mj_url];
  137. } else if (type.isNumberType) {
  138. NSString *oldValue = value;
  139. // NSString -> NSNumber
  140. if (type.typeClass == [NSDecimalNumber class]) {
  141. value = [NSDecimalNumber decimalNumberWithString:oldValue];
  142. } else {
  143. value = [numberFormatter_ numberFromString:oldValue];
  144. }
  145. // 如果是BOOL
  146. if (type.isBoolType) {
  147. // 字符串转BOOL(字符串没有charValue方法)
  148. // 系统会调用字符串的charValue转为BOOL类型
  149. NSString *lower = [oldValue lowercaseString];
  150. if ([lower isEqualToString:@"yes"] || [lower isEqualToString:@"true"]) {
  151. value = @YES;
  152. } else if ([lower isEqualToString:@"no"] || [lower isEqualToString:@"false"]) {
  153. value = @NO;
  154. }
  155. }
  156. }
  157. }
  158. // value和property类型不匹配
  159. if (propertyClass && ![value isKindOfClass:propertyClass]) {
  160. value = nil;
  161. }
  162. }
  163. // 3.赋值
  164. [property setValue:value forObject:self];
  165. } @catch (NSException *exception) {
  166. MJExtensionBuildError([self class], exception.reason);
  167. MJExtensionLog(@"%@", exception);
  168. }
  169. }];
  170. // 转换完毕
  171. if ([self respondsToSelector:@selector(mj_keyValuesDidFinishConvertingToObject)]) {
  172. [self mj_keyValuesDidFinishConvertingToObject];
  173. }
  174. return self;
  175. }
  176. + (instancetype)mj_objectWithKeyValues:(id)keyValues
  177. {
  178. return [self mj_objectWithKeyValues:keyValues context:nil];
  179. }
  180. + (instancetype)mj_objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
  181. {
  182. // 获得JSON对象
  183. keyValues = [keyValues mj_JSONObject];
  184. MJExtensionAssertError([keyValues isKindOfClass:[NSDictionary class]], nil, [self class], @"keyValues参数不是一个字典");
  185. if ([self isSubclassOfClass:[NSManagedObject class]] && context) {
  186. NSString *entityName = [NSStringFromClass(self) componentsSeparatedByString:@"."].lastObject;
  187. return [[NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context] mj_setKeyValues:keyValues context:context];
  188. }
  189. return [[[self alloc] init] mj_setKeyValues:keyValues];
  190. }
  191. + (instancetype)mj_objectWithFilename:(NSString *)filename
  192. {
  193. MJExtensionAssertError(filename != nil, nil, [self class], @"filename参数为nil");
  194. return [self mj_objectWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
  195. }
  196. + (instancetype)mj_objectWithFile:(NSString *)file
  197. {
  198. MJExtensionAssertError(file != nil, nil, [self class], @"file参数为nil");
  199. return [self mj_objectWithKeyValues:[NSDictionary dictionaryWithContentsOfFile:file]];
  200. }
  201. #pragma mark - 字典数组 -> 模型数组
  202. + (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
  203. {
  204. return [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:nil];
  205. }
  206. + (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
  207. {
  208. // 如果是JSON字符串
  209. keyValuesArray = [keyValuesArray mj_JSONObject];
  210. // 1.判断真实性
  211. MJExtensionAssertError([keyValuesArray isKindOfClass:[NSArray class]], nil, [self class], @"keyValuesArray参数不是一个数组");
  212. // 如果数组里面放的是NSString、NSNumber等数据
  213. if ([MJFoundation isClassFromFoundation:self]) return [NSMutableArray arrayWithArray:keyValuesArray];
  214. // 2.创建数组
  215. NSMutableArray *modelArray = [NSMutableArray array];
  216. // 3.遍历
  217. for (NSDictionary *keyValues in keyValuesArray) {
  218. if ([keyValues isKindOfClass:[NSArray class]]){
  219. [modelArray addObject:[self mj_objectArrayWithKeyValuesArray:keyValues context:context]];
  220. } else {
  221. id model = [self mj_objectWithKeyValues:keyValues context:context];
  222. if (model) [modelArray addObject:model];
  223. }
  224. }
  225. return modelArray;
  226. }
  227. + (NSMutableArray *)mj_objectArrayWithFilename:(NSString *)filename
  228. {
  229. MJExtensionAssertError(filename != nil, nil, [self class], @"filename参数为nil");
  230. return [self mj_objectArrayWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
  231. }
  232. + (NSMutableArray *)mj_objectArrayWithFile:(NSString *)file
  233. {
  234. MJExtensionAssertError(file != nil, nil, [self class], @"file参数为nil");
  235. return [self mj_objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:file]];
  236. }
  237. #pragma mark - 模型 -> 字典
  238. - (NSMutableDictionary *)mj_keyValues
  239. {
  240. return [self mj_keyValuesWithKeys:nil ignoredKeys:nil];
  241. }
  242. - (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys
  243. {
  244. return [self mj_keyValuesWithKeys:keys ignoredKeys:nil];
  245. }
  246. - (NSMutableDictionary *)mj_keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
  247. {
  248. return [self mj_keyValuesWithKeys:nil ignoredKeys:ignoredKeys];
  249. }
  250. - (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys
  251. {
  252. // 如果自己不是模型类, 那就返回自己
  253. MJExtensionAssertError(![MJFoundation isClassFromFoundation:[self class]], (NSMutableDictionary *)self, [self class], @"不是自定义的模型类")
  254. id keyValues = [NSMutableDictionary dictionary];
  255. Class clazz = [self class];
  256. NSArray *allowedPropertyNames = [clazz mj_totalAllowedPropertyNames];
  257. NSArray *ignoredPropertyNames = [clazz mj_totalIgnoredPropertyNames];
  258. [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {
  259. @try {
  260. // 0.检测是否被忽略
  261. if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
  262. if ([ignoredPropertyNames containsObject:property.name]) return;
  263. if (keys.count && ![keys containsObject:property.name]) return;
  264. if ([ignoredKeys containsObject:property.name]) return;
  265. // 1.取出属性值
  266. id value = [property valueForObject:self];
  267. if (!value) return;
  268. // 2.如果是模型属性
  269. MJPropertyType *type = property.type;
  270. Class propertyClass = type.typeClass;
  271. if (!type.isFromFoundation && propertyClass) {
  272. value = [value mj_keyValues];
  273. } else if ([value isKindOfClass:[NSArray class]]) {
  274. // 3.处理数组里面有模型的情况
  275. value = [NSObject mj_keyValuesArrayWithObjectArray:value];
  276. } else if (propertyClass == [NSURL class]) {
  277. value = [value absoluteString];
  278. }
  279. // 4.赋值
  280. if ([clazz mj_isReferenceReplacedKeyWhenCreatingKeyValues]) {
  281. NSArray *propertyKeys = [[property propertyKeysForClass:clazz] firstObject];
  282. NSUInteger keyCount = propertyKeys.count;
  283. // 创建字典
  284. __block id innerContainer = keyValues;
  285. [propertyKeys enumerateObjectsUsingBlock:^(MJPropertyKey *propertyKey, NSUInteger idx, BOOL *stop) {
  286. // 下一个属性
  287. MJPropertyKey *nextPropertyKey = nil;
  288. if (idx != keyCount - 1) {
  289. nextPropertyKey = propertyKeys[idx + 1];
  290. }
  291. if (nextPropertyKey) { // 不是最后一个key
  292. // 当前propertyKey对应的字典或者数组
  293. id tempInnerContainer = [propertyKey valueInObject:innerContainer];
  294. if (tempInnerContainer == nil || [tempInnerContainer isKindOfClass:[NSNull class]]) {
  295. if (nextPropertyKey.type == MJPropertyKeyTypeDictionary) {
  296. tempInnerContainer = [NSMutableDictionary dictionary];
  297. } else {
  298. tempInnerContainer = [NSMutableArray array];
  299. }
  300. if (propertyKey.type == MJPropertyKeyTypeDictionary) {
  301. innerContainer[propertyKey.name] = tempInnerContainer;
  302. } else {
  303. innerContainer[propertyKey.name.intValue] = tempInnerContainer;
  304. }
  305. }
  306. if ([tempInnerContainer isKindOfClass:[NSMutableArray class]]) {
  307. NSMutableArray *tempInnerContainerArray = tempInnerContainer;
  308. int index = nextPropertyKey.name.intValue;
  309. while (tempInnerContainerArray.count < index + 1) {
  310. [tempInnerContainerArray addObject:[NSNull null]];
  311. }
  312. }
  313. innerContainer = tempInnerContainer;
  314. } else { // 最后一个key
  315. if (propertyKey.type == MJPropertyKeyTypeDictionary) {
  316. innerContainer[propertyKey.name] = value;
  317. } else {
  318. innerContainer[propertyKey.name.intValue] = value;
  319. }
  320. }
  321. }];
  322. } else {
  323. keyValues[property.name] = value;
  324. }
  325. } @catch (NSException *exception) {
  326. MJExtensionBuildError([self class], exception.reason);
  327. MJExtensionLog(@"%@", exception);
  328. }
  329. }];
  330. // 转换完毕
  331. if ([self respondsToSelector:@selector(mj_objectDidFinishConvertingToKeyValues)]) {
  332. [self mj_objectDidFinishConvertingToKeyValues];
  333. }
  334. return keyValues;
  335. }
  336. #pragma mark - 模型数组 -> 字典数组
  337. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray
  338. {
  339. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:nil];
  340. }
  341. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
  342. {
  343. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys ignoredKeys:nil];
  344. }
  345. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
  346. {
  347. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:ignoredKeys];
  348. }
  349. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys
  350. {
  351. // 0.判断真实性
  352. MJExtensionAssertError([objectArray isKindOfClass:[NSArray class]], nil, [self class], @"objectArray参数不是一个数组");
  353. // 1.创建数组
  354. NSMutableArray *keyValuesArray = [NSMutableArray array];
  355. for (id object in objectArray) {
  356. if (keys) {
  357. [keyValuesArray addObject:[object mj_keyValuesWithKeys:keys]];
  358. } else {
  359. [keyValuesArray addObject:[object mj_keyValuesWithIgnoredKeys:ignoredKeys]];
  360. }
  361. }
  362. return keyValuesArray;
  363. }
  364. #pragma mark - 转换为JSON
  365. - (NSData *)mj_JSONData
  366. {
  367. if ([self isKindOfClass:[NSString class]]) {
  368. return [((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding];
  369. } else if ([self isKindOfClass:[NSData class]]) {
  370. return (NSData *)self;
  371. }
  372. return [NSJSONSerialization dataWithJSONObject:[self mj_JSONObject] options:kNilOptions error:nil];
  373. }
  374. - (id)mj_JSONObject
  375. {
  376. if ([self isKindOfClass:[NSString class]]) {
  377. return [NSJSONSerialization JSONObjectWithData:[((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
  378. } else if ([self isKindOfClass:[NSData class]]) {
  379. return [NSJSONSerialization JSONObjectWithData:(NSData *)self options:kNilOptions error:nil];
  380. }
  381. return self.mj_keyValues;
  382. }
  383. - (NSString *)mj_JSONString
  384. {
  385. if ([self isKindOfClass:[NSString class]]) {
  386. return (NSString *)self;
  387. } else if ([self isKindOfClass:[NSData class]]) {
  388. return [[NSString alloc] initWithData:(NSData *)self encoding:NSUTF8StringEncoding];
  389. }
  390. return [[NSString alloc] initWithData:[self mj_JSONData] encoding:NSUTF8StringEncoding];
  391. }
  392. @end
  393. @implementation NSObject (MJKeyValueDeprecated_v_2_5_16)
  394. - (instancetype)setKeyValues:(id)keyValues
  395. {
  396. return [self mj_setKeyValues:keyValues];
  397. }
  398. - (instancetype)setKeyValues:(id)keyValues error:(NSError **)error
  399. {
  400. id value = [self mj_setKeyValues:keyValues];
  401. if (error != NULL) {
  402. *error = [self.class mj_error];
  403. }
  404. return value;
  405. }
  406. - (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
  407. {
  408. return [self mj_setKeyValues:keyValues context:context];
  409. }
  410. - (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError **)error
  411. {
  412. id value = [self mj_setKeyValues:keyValues context:context];
  413. if (error != NULL) {
  414. *error = [self.class mj_error];
  415. }
  416. return value;
  417. }
  418. + (void)referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference
  419. {
  420. [self mj_referenceReplacedKeyWhenCreatingKeyValues:reference];
  421. }
  422. - (NSMutableDictionary *)keyValues
  423. {
  424. return [self mj_keyValues];
  425. }
  426. - (NSMutableDictionary *)keyValuesWithError:(NSError **)error
  427. {
  428. id value = [self mj_keyValues];
  429. if (error != NULL) {
  430. *error = [self.class mj_error];
  431. }
  432. return value;
  433. }
  434. - (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys
  435. {
  436. return [self mj_keyValuesWithKeys:keys];
  437. }
  438. - (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys error:(NSError **)error
  439. {
  440. id value = [self mj_keyValuesWithKeys:keys];
  441. if (error != NULL) {
  442. *error = [self.class mj_error];
  443. }
  444. return value;
  445. }
  446. - (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
  447. {
  448. return [self mj_keyValuesWithIgnoredKeys:ignoredKeys];
  449. }
  450. - (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys error:(NSError **)error
  451. {
  452. id value = [self mj_keyValuesWithIgnoredKeys:ignoredKeys];
  453. if (error != NULL) {
  454. *error = [self.class mj_error];
  455. }
  456. return value;
  457. }
  458. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray
  459. {
  460. return [self mj_keyValuesArrayWithObjectArray:objectArray];
  461. }
  462. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray error:(NSError **)error
  463. {
  464. id value = [self mj_keyValuesArrayWithObjectArray:objectArray];
  465. if (error != NULL) {
  466. *error = [self mj_error];
  467. }
  468. return value;
  469. }
  470. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
  471. {
  472. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys];
  473. }
  474. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys error:(NSError **)error
  475. {
  476. id value = [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys];
  477. if (error != NULL) {
  478. *error = [self mj_error];
  479. }
  480. return value;
  481. }
  482. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
  483. {
  484. return [self mj_keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys];
  485. }
  486. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys error:(NSError **)error
  487. {
  488. id value = [self mj_keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys];
  489. if (error != NULL) {
  490. *error = [self mj_error];
  491. }
  492. return value;
  493. }
  494. + (instancetype)objectWithKeyValues:(id)keyValues
  495. {
  496. return [self mj_objectWithKeyValues:keyValues];
  497. }
  498. + (instancetype)objectWithKeyValues:(id)keyValues error:(NSError **)error
  499. {
  500. id value = [self mj_objectWithKeyValues:keyValues];
  501. if (error != NULL) {
  502. *error = [self mj_error];
  503. }
  504. return value;
  505. }
  506. + (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
  507. {
  508. return [self mj_objectWithKeyValues:keyValues context:context];
  509. }
  510. + (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError **)error
  511. {
  512. id value = [self mj_objectWithKeyValues:keyValues context:context];
  513. if (error != NULL) {
  514. *error = [self mj_error];
  515. }
  516. return value;
  517. }
  518. + (instancetype)objectWithFilename:(NSString *)filename
  519. {
  520. return [self mj_objectWithFilename:filename];
  521. }
  522. + (instancetype)objectWithFilename:(NSString *)filename error:(NSError **)error
  523. {
  524. id value = [self mj_objectWithFilename:filename];
  525. if (error != NULL) {
  526. *error = [self mj_error];
  527. }
  528. return value;
  529. }
  530. + (instancetype)objectWithFile:(NSString *)file
  531. {
  532. return [self mj_objectWithFile:file];
  533. }
  534. + (instancetype)objectWithFile:(NSString *)file error:(NSError **)error
  535. {
  536. id value = [self mj_objectWithFile:file];
  537. if (error != NULL) {
  538. *error = [self mj_error];
  539. }
  540. return value;
  541. }
  542. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray
  543. {
  544. return [self mj_objectArrayWithKeyValuesArray:keyValuesArray];
  545. }
  546. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray error:(NSError **)error
  547. {
  548. id value = [self mj_objectArrayWithKeyValuesArray:keyValuesArray];
  549. if (error != NULL) {
  550. *error = [self mj_error];
  551. }
  552. return value;
  553. }
  554. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
  555. {
  556. return [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:context];
  557. }
  558. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context error:(NSError **)error
  559. {
  560. id value = [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:context];
  561. if (error != NULL) {
  562. *error = [self mj_error];
  563. }
  564. return value;
  565. }
  566. + (NSMutableArray *)objectArrayWithFilename:(NSString *)filename
  567. {
  568. return [self mj_objectArrayWithFilename:filename];
  569. }
  570. + (NSMutableArray *)objectArrayWithFilename:(NSString *)filename error:(NSError **)error
  571. {
  572. id value = [self mj_objectArrayWithFilename:filename];
  573. if (error != NULL) {
  574. *error = [self mj_error];
  575. }
  576. return value;
  577. }
  578. + (NSMutableArray *)objectArrayWithFile:(NSString *)file
  579. {
  580. return [self mj_objectArrayWithFile:file];
  581. }
  582. + (NSMutableArray *)objectArrayWithFile:(NSString *)file error:(NSError **)error
  583. {
  584. id value = [self mj_objectArrayWithFile:file];
  585. if (error != NULL) {
  586. *error = [self mj_error];
  587. }
  588. return value;
  589. }
  590. - (NSData *)JSONData
  591. {
  592. return [self mj_JSONData];
  593. }
  594. - (id)JSONObject
  595. {
  596. return [self mj_JSONObject];
  597. }
  598. - (NSString *)JSONString
  599. {
  600. return [self mj_JSONString];
  601. }
  602. @end