NSObject+MJKeyValue.m 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  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.class == [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. return [[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass(self) inManagedObjectContext:context] mj_setKeyValues:keyValues context:context];
  187. }
  188. return [[[self alloc] init] mj_setKeyValues:keyValues];
  189. }
  190. + (instancetype)mj_objectWithFilename:(NSString *)filename
  191. {
  192. MJExtensionAssertError(filename != nil, nil, [self class], @"filename参数为nil");
  193. return [self mj_objectWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
  194. }
  195. + (instancetype)mj_objectWithFile:(NSString *)file
  196. {
  197. MJExtensionAssertError(file != nil, nil, [self class], @"file参数为nil");
  198. return [self mj_objectWithKeyValues:[NSDictionary dictionaryWithContentsOfFile:file]];
  199. }
  200. #pragma mark - 字典数组 -> 模型数组
  201. + (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
  202. {
  203. return [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:nil];
  204. }
  205. + (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
  206. {
  207. // 如果是JSON字符串
  208. keyValuesArray = [keyValuesArray mj_JSONObject];
  209. // 1.判断真实性
  210. MJExtensionAssertError([keyValuesArray isKindOfClass:[NSArray class]], nil, [self class], @"keyValuesArray参数不是一个数组");
  211. // 如果数组里面放的是NSString、NSNumber等数据
  212. if ([MJFoundation isClassFromFoundation:self]) return [NSMutableArray arrayWithArray:keyValuesArray];
  213. // 2.创建数组
  214. NSMutableArray *modelArray = [NSMutableArray array];
  215. // 3.遍历
  216. for (NSDictionary *keyValues in keyValuesArray) {
  217. if ([keyValues isKindOfClass:[NSArray class]]){
  218. [modelArray addObject:[self mj_objectArrayWithKeyValuesArray:keyValues context:context]];
  219. } else {
  220. id model = [self mj_objectWithKeyValues:keyValues context:context];
  221. if (model) [modelArray addObject:model];
  222. }
  223. }
  224. return modelArray;
  225. }
  226. + (NSMutableArray *)mj_objectArrayWithFilename:(NSString *)filename
  227. {
  228. MJExtensionAssertError(filename != nil, nil, [self class], @"filename参数为nil");
  229. return [self mj_objectArrayWithFile:[[NSBundle mainBundle] pathForResource:filename ofType:nil]];
  230. }
  231. + (NSMutableArray *)mj_objectArrayWithFile:(NSString *)file
  232. {
  233. MJExtensionAssertError(file != nil, nil, [self class], @"file参数为nil");
  234. return [self mj_objectArrayWithKeyValuesArray:[NSArray arrayWithContentsOfFile:file]];
  235. }
  236. #pragma mark - 模型 -> 字典
  237. - (NSMutableDictionary *)mj_keyValues
  238. {
  239. return [self mj_keyValuesWithKeys:nil ignoredKeys:nil];
  240. }
  241. - (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys
  242. {
  243. return [self mj_keyValuesWithKeys:keys ignoredKeys:nil];
  244. }
  245. - (NSMutableDictionary *)mj_keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
  246. {
  247. return [self mj_keyValuesWithKeys:nil ignoredKeys:ignoredKeys];
  248. }
  249. - (NSMutableDictionary *)mj_keyValuesWithKeys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys
  250. {
  251. // 如果自己不是模型类, 那就返回自己
  252. MJExtensionAssertError(![MJFoundation isClassFromFoundation:[self class]], (NSMutableDictionary *)self, [self class], @"不是自定义的模型类")
  253. id keyValues = [NSMutableDictionary dictionary];
  254. Class clazz = [self class];
  255. NSArray *allowedPropertyNames = [clazz mj_totalAllowedPropertyNames];
  256. NSArray *ignoredPropertyNames = [clazz mj_totalIgnoredPropertyNames];
  257. [clazz mj_enumerateProperties:^(MJProperty *property, BOOL *stop) {
  258. @try {
  259. // 0.检测是否被忽略
  260. if (allowedPropertyNames.count && ![allowedPropertyNames containsObject:property.name]) return;
  261. if ([ignoredPropertyNames containsObject:property.name]) return;
  262. if (keys.count && ![keys containsObject:property.name]) return;
  263. if ([ignoredKeys containsObject:property.name]) return;
  264. // 1.取出属性值
  265. id value = [property valueForObject:self];
  266. if (!value) return;
  267. // 2.如果是模型属性
  268. MJPropertyType *type = property.type;
  269. Class propertyClass = type.typeClass;
  270. if (!type.isFromFoundation && propertyClass) {
  271. value = [value mj_keyValues];
  272. } else if ([value isKindOfClass:[NSArray class]]) {
  273. // 3.处理数组里面有模型的情况
  274. value = [NSObject mj_keyValuesArrayWithObjectArray:value];
  275. } else if (propertyClass == [NSURL class]) {
  276. value = [value absoluteString];
  277. }
  278. // 4.赋值
  279. if ([clazz mj_isReferenceReplacedKeyWhenCreatingKeyValues]) {
  280. NSArray *propertyKeys = [[property propertyKeysForClass:clazz] firstObject];
  281. NSUInteger keyCount = propertyKeys.count;
  282. // 创建字典
  283. __block id innerContainer = keyValues;
  284. [propertyKeys enumerateObjectsUsingBlock:^(MJPropertyKey *propertyKey, NSUInteger idx, BOOL *stop) {
  285. // 下一个属性
  286. MJPropertyKey *nextPropertyKey = nil;
  287. if (idx != keyCount - 1) {
  288. nextPropertyKey = propertyKeys[idx + 1];
  289. }
  290. if (nextPropertyKey) { // 不是最后一个key
  291. // 当前propertyKey对应的字典或者数组
  292. id tempInnerContainer = [propertyKey valueInObject:innerContainer];
  293. if (tempInnerContainer == nil || [tempInnerContainer isKindOfClass:[NSNull class]]) {
  294. if (nextPropertyKey.type == MJPropertyKeyTypeDictionary) {
  295. tempInnerContainer = [NSMutableDictionary dictionary];
  296. } else {
  297. tempInnerContainer = [NSMutableArray array];
  298. }
  299. if (propertyKey.type == MJPropertyKeyTypeDictionary) {
  300. innerContainer[propertyKey.name] = tempInnerContainer;
  301. } else {
  302. innerContainer[propertyKey.name.intValue] = tempInnerContainer;
  303. }
  304. }
  305. if ([tempInnerContainer isKindOfClass:[NSMutableArray class]]) {
  306. NSMutableArray *tempInnerContainerArray = tempInnerContainer;
  307. int index = nextPropertyKey.name.intValue;
  308. while (tempInnerContainerArray.count < index + 1) {
  309. [tempInnerContainerArray addObject:[NSNull null]];
  310. }
  311. }
  312. innerContainer = tempInnerContainer;
  313. } else { // 最后一个key
  314. if (propertyKey.type == MJPropertyKeyTypeDictionary) {
  315. innerContainer[propertyKey.name] = value;
  316. } else {
  317. innerContainer[propertyKey.name.intValue] = value;
  318. }
  319. }
  320. }];
  321. } else {
  322. keyValues[property.name] = value;
  323. }
  324. } @catch (NSException *exception) {
  325. MJExtensionBuildError([self class], exception.reason);
  326. MJExtensionLog(@"%@", exception);
  327. }
  328. }];
  329. // 转换完毕
  330. if ([self respondsToSelector:@selector(mj_objectDidFinishConvertingToKeyValues)]) {
  331. [self mj_objectDidFinishConvertingToKeyValues];
  332. }
  333. return keyValues;
  334. }
  335. #pragma mark - 模型数组 -> 字典数组
  336. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray
  337. {
  338. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:nil];
  339. }
  340. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
  341. {
  342. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys ignoredKeys:nil];
  343. }
  344. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
  345. {
  346. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:nil ignoredKeys:ignoredKeys];
  347. }
  348. + (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys ignoredKeys:(NSArray *)ignoredKeys
  349. {
  350. // 0.判断真实性
  351. MJExtensionAssertError([objectArray isKindOfClass:[NSArray class]], nil, [self class], @"objectArray参数不是一个数组");
  352. // 1.创建数组
  353. NSMutableArray *keyValuesArray = [NSMutableArray array];
  354. for (id object in objectArray) {
  355. if (keys) {
  356. [keyValuesArray addObject:[object mj_keyValuesWithKeys:keys]];
  357. } else {
  358. [keyValuesArray addObject:[object mj_keyValuesWithIgnoredKeys:ignoredKeys]];
  359. }
  360. }
  361. return keyValuesArray;
  362. }
  363. #pragma mark - 转换为JSON
  364. - (NSData *)mj_JSONData
  365. {
  366. if ([self isKindOfClass:[NSString class]]) {
  367. return [((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding];
  368. } else if ([self isKindOfClass:[NSData class]]) {
  369. return (NSData *)self;
  370. }
  371. return [NSJSONSerialization dataWithJSONObject:[self mj_JSONObject] options:kNilOptions error:nil];
  372. }
  373. - (id)mj_JSONObject
  374. {
  375. if ([self isKindOfClass:[NSString class]]) {
  376. return [NSJSONSerialization JSONObjectWithData:[((NSString *)self) dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
  377. } else if ([self isKindOfClass:[NSData class]]) {
  378. return [NSJSONSerialization JSONObjectWithData:(NSData *)self options:kNilOptions error:nil];
  379. }
  380. return self.mj_keyValues;
  381. }
  382. - (NSString *)mj_JSONString
  383. {
  384. if ([self isKindOfClass:[NSString class]]) {
  385. return (NSString *)self;
  386. } else if ([self isKindOfClass:[NSData class]]) {
  387. return [[NSString alloc] initWithData:(NSData *)self encoding:NSUTF8StringEncoding];
  388. }
  389. return [[NSString alloc] initWithData:[self mj_JSONData] encoding:NSUTF8StringEncoding];
  390. }
  391. @end
  392. @implementation NSObject (MJKeyValueDeprecated_v_2_5_16)
  393. - (instancetype)setKeyValues:(id)keyValues
  394. {
  395. return [self mj_setKeyValues:keyValues];
  396. }
  397. - (instancetype)setKeyValues:(id)keyValues error:(NSError **)error
  398. {
  399. id value = [self mj_setKeyValues:keyValues];
  400. if (error != NULL) {
  401. *error = [self.class mj_error];
  402. }
  403. return value;
  404. }
  405. - (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
  406. {
  407. return [self mj_setKeyValues:keyValues context:context];
  408. }
  409. - (instancetype)setKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError **)error
  410. {
  411. id value = [self mj_setKeyValues:keyValues context:context];
  412. if (error != NULL) {
  413. *error = [self.class mj_error];
  414. }
  415. return value;
  416. }
  417. + (void)referenceReplacedKeyWhenCreatingKeyValues:(BOOL)reference
  418. {
  419. [self mj_referenceReplacedKeyWhenCreatingKeyValues:reference];
  420. }
  421. - (NSMutableDictionary *)keyValues
  422. {
  423. return [self mj_keyValues];
  424. }
  425. - (NSMutableDictionary *)keyValuesWithError:(NSError **)error
  426. {
  427. id value = [self mj_keyValues];
  428. if (error != NULL) {
  429. *error = [self.class mj_error];
  430. }
  431. return value;
  432. }
  433. - (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys
  434. {
  435. return [self mj_keyValuesWithKeys:keys];
  436. }
  437. - (NSMutableDictionary *)keyValuesWithKeys:(NSArray *)keys error:(NSError **)error
  438. {
  439. id value = [self mj_keyValuesWithKeys:keys];
  440. if (error != NULL) {
  441. *error = [self.class mj_error];
  442. }
  443. return value;
  444. }
  445. - (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys
  446. {
  447. return [self mj_keyValuesWithIgnoredKeys:ignoredKeys];
  448. }
  449. - (NSMutableDictionary *)keyValuesWithIgnoredKeys:(NSArray *)ignoredKeys error:(NSError **)error
  450. {
  451. id value = [self mj_keyValuesWithIgnoredKeys:ignoredKeys];
  452. if (error != NULL) {
  453. *error = [self.class mj_error];
  454. }
  455. return value;
  456. }
  457. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray
  458. {
  459. return [self mj_keyValuesArrayWithObjectArray:objectArray];
  460. }
  461. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray error:(NSError **)error
  462. {
  463. id value = [self mj_keyValuesArrayWithObjectArray:objectArray];
  464. if (error != NULL) {
  465. *error = [self mj_error];
  466. }
  467. return value;
  468. }
  469. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys
  470. {
  471. return [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys];
  472. }
  473. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray keys:(NSArray *)keys error:(NSError **)error
  474. {
  475. id value = [self mj_keyValuesArrayWithObjectArray:objectArray keys:keys];
  476. if (error != NULL) {
  477. *error = [self mj_error];
  478. }
  479. return value;
  480. }
  481. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys
  482. {
  483. return [self mj_keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys];
  484. }
  485. + (NSMutableArray *)keyValuesArrayWithObjectArray:(NSArray *)objectArray ignoredKeys:(NSArray *)ignoredKeys error:(NSError **)error
  486. {
  487. id value = [self mj_keyValuesArrayWithObjectArray:objectArray ignoredKeys:ignoredKeys];
  488. if (error != NULL) {
  489. *error = [self mj_error];
  490. }
  491. return value;
  492. }
  493. + (instancetype)objectWithKeyValues:(id)keyValues
  494. {
  495. return [self mj_objectWithKeyValues:keyValues];
  496. }
  497. + (instancetype)objectWithKeyValues:(id)keyValues error:(NSError **)error
  498. {
  499. id value = [self mj_objectWithKeyValues:keyValues];
  500. if (error != NULL) {
  501. *error = [self mj_error];
  502. }
  503. return value;
  504. }
  505. + (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context
  506. {
  507. return [self mj_objectWithKeyValues:keyValues context:context];
  508. }
  509. + (instancetype)objectWithKeyValues:(id)keyValues context:(NSManagedObjectContext *)context error:(NSError **)error
  510. {
  511. id value = [self mj_objectWithKeyValues:keyValues context:context];
  512. if (error != NULL) {
  513. *error = [self mj_error];
  514. }
  515. return value;
  516. }
  517. + (instancetype)objectWithFilename:(NSString *)filename
  518. {
  519. return [self mj_objectWithFilename:filename];
  520. }
  521. + (instancetype)objectWithFilename:(NSString *)filename error:(NSError **)error
  522. {
  523. id value = [self mj_objectWithFilename:filename];
  524. if (error != NULL) {
  525. *error = [self mj_error];
  526. }
  527. return value;
  528. }
  529. + (instancetype)objectWithFile:(NSString *)file
  530. {
  531. return [self mj_objectWithFile:file];
  532. }
  533. + (instancetype)objectWithFile:(NSString *)file error:(NSError **)error
  534. {
  535. id value = [self mj_objectWithFile:file];
  536. if (error != NULL) {
  537. *error = [self mj_error];
  538. }
  539. return value;
  540. }
  541. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray
  542. {
  543. return [self mj_objectArrayWithKeyValuesArray:keyValuesArray];
  544. }
  545. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray error:(NSError **)error
  546. {
  547. id value = [self mj_objectArrayWithKeyValuesArray:keyValuesArray];
  548. if (error != NULL) {
  549. *error = [self mj_error];
  550. }
  551. return value;
  552. }
  553. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context
  554. {
  555. return [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:context];
  556. }
  557. + (NSMutableArray *)objectArrayWithKeyValuesArray:(id)keyValuesArray context:(NSManagedObjectContext *)context error:(NSError **)error
  558. {
  559. id value = [self mj_objectArrayWithKeyValuesArray:keyValuesArray context:context];
  560. if (error != NULL) {
  561. *error = [self mj_error];
  562. }
  563. return value;
  564. }
  565. + (NSMutableArray *)objectArrayWithFilename:(NSString *)filename
  566. {
  567. return [self mj_objectArrayWithFilename:filename];
  568. }
  569. + (NSMutableArray *)objectArrayWithFilename:(NSString *)filename error:(NSError **)error
  570. {
  571. id value = [self mj_objectArrayWithFilename:filename];
  572. if (error != NULL) {
  573. *error = [self mj_error];
  574. }
  575. return value;
  576. }
  577. + (NSMutableArray *)objectArrayWithFile:(NSString *)file
  578. {
  579. return [self mj_objectArrayWithFile:file];
  580. }
  581. + (NSMutableArray *)objectArrayWithFile:(NSString *)file error:(NSError **)error
  582. {
  583. id value = [self mj_objectArrayWithFile:file];
  584. if (error != NULL) {
  585. *error = [self mj_error];
  586. }
  587. return value;
  588. }
  589. - (NSData *)JSONData
  590. {
  591. return [self mj_JSONData];
  592. }
  593. - (id)JSONObject
  594. {
  595. return [self mj_JSONObject];
  596. }
  597. - (NSString *)JSONString
  598. {
  599. return [self mj_JSONString];
  600. }
  601. @end