看着java上的jsonObject比较眼馋,于是自己做了一个,代码如下,完善了错误信息:
NSObject+json.h
#import <Foundation/Foundation.h>
@interface NSObject (json)
-(id)jsonObject:(NSData *)data error:(NSError **)error;
-(NSData *)createJsonData:(NSError **)error;
@end
NSObject+json.m
#import "NSObject+json.h"
@implementation NSObject (json)
-(id)jsonObject:(NSData *)data error:(NSError **)error{
id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:error];
if (error ==nil&&[jsonObject count]!=0){
@try {
NSArray *array = [jsonObject allKeys]; //因为有可能抛出异常来
NSArray *arrayKey = [self attributeKeys];
//比较两个数组的元素,如果本类里面的元素包含了接受到的json字典里面的元素即可,如果不包含就抛出错误并返回nil
NSSet *jsonSet = [NSSet setWithArray:array];
NSSet *attributeKeySet = [NSSet setWithArray:arrayKey];
if ([jsonSet isSubsetOfSet:attributeKeySet]) {
for (NSString *strKey in array) {
[self setValue:[jsonObject objectForKey:strKey] forKey:strKey];
}
}else{
*error = [self _createExceptionError:@"this NSData has an invalid argument"];
return nil;
}
}
@catch (NSException *exception) {
*error = [self _createExceptionError:[NSString stringWithFormat:@"%@",exception]];
return nil;
}
}else{
*error = [self _createExceptionError:@"this NSData is an invalid argument for jsonObject"];
return nil;
}
return self;
}
-(NSData *)createJsonData:(NSError *__autoreleasing *)error {
if ([self respondsToSelector:@selector(attributeKeys)]) { //必须重载attributeKeys函数
NSArray *array = [self attributeKeys];
NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
for (NSString *keyName in array) {
[dic setObject:[self valueForKey:keyName] forKey:keyName];
}
return [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:error];
}
return nil;
}
-(NSError *)_createExceptionError:(NSString *)errorMsg{
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errorMsg forKey:NSLocalizedDescriptionKey];
return [NSError errorWithDomain:@"jsonObjectException"
code:0
userInfo:userInfo];
}
@end
使用方法和案例:
ATClass.h
#import <Foundation/Foundation.h>
@interface ATClass : NSObject
@property (strong) NSArray *array;
@property (strong) NSString *name;
@property NSInteger index;
@end
ATClass.m
#import "ATClass.h"
@implementation ATClass
@synthesize name,array,index;
-(id)init{
self = [super init];
if (self) {
self.array = [NSArray arrayWithObjects:@"123", nil];
self.name = @"1234";
self.index =23;
}
return self;
}
-(NSArray*)attributeKeys{
return [NSArray arrayWithObjects:@"array",@"name",@"index",nil];
}
@end
main.m
ATClass *class = [[ATClass alloc]init];
NSData *data = [class createJsonData:nil];
class.array = [NSArray arrayWithObjects:@"321", nil];
class.index = 32;
NSArray *object =[NSArray arrayWithObjects:@"123312", nil];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:0 error:nil];
NSError *error;
// class = [class jsonObject:jsonData error:&error];
class = [class jsonObject:data error:&error];
NSLog(@"%@",error);