这个是对上面一篇写的一个解析json对象的基类
@interface BaseObjectFromJson : NSObject
+ (id) objectWithDict:(NSDictionary*)dict withClassName:(NSString*)className;
+ (NSArray*) objectsWithArray:(NSArray*)array withClassName:(NSString*)className;
- (id) initWithDict:(NSDictionary*)dict;
- (NSString*) propertyClassName:(NSString*)propertyName;
@end
//
// BaseObjectFromJson.m
// xxoo
//
// Created by Tommy on 13-11-5.
// Copyright (c) 2013年 Tommy. All rights reserved.
//
#import "BaseObjectFromJson.h"
#import "objcUtils.h"
@implementation BaseObjectFromJson
+ (id) objectWithDict:(NSDictionary*)dict withClassName:(NSString*)className{
Class objClass = NSClassFromString(className);
BaseObjectFromJson* object = nil;
if(objClass){
object = [[objClass alloc] initWithDict:dict];
}else{
NSAssert(0, @"Unknown class:%@",className);
}
return object;
}
+ (NSArray*) objectsWithArray:(NSArray*)array withClassName:(NSString*)className{
Class objClass = NSClassFromString(className);
BaseObjectFromJson* object = nil;
NSMutableArray* objArray = nil;
if(objClass){
objArray = [NSMutableArray new];
for (NSDictionary* dict in array){
object = [[objClass alloc] initWithDict:dict];
[objArray addObject:object];
}
}else{
NSAssert(0, @"Unknown class:%@",className);
}
return objArray;
}
- (NSString*) description{
NSMutableString* desc = [NSMutableString new];
NSArray* propertyArray = getPropertyNameList(self);
[desc appendString:@"{\r"];
for (NSString* key in propertyArray) {
[desc appendFormat:@" %@ : %@\r",key,[self valueForKey:key]];
}
[desc appendString:@"\r}"];
return desc ;
}
- (id) initWithDict:(NSDictionary*)dict{
NSArray* propertyArray = getPropertyNameList(self);
for (NSString* key in propertyArray) {
@try{
if([dict[key] isKindOfClass:[NSArray class]]){
NSString* className = [self propertyClassName:key];
NSArray* array = [BaseObjectFromJson objectsWithArray:dict[key] withClassName:className?className:key];
[self setValue:array forKey:key];
}else if([dict[key] isKindOfClass:[NSDictionary class]]){
[self setValue:[BaseObjectFromJson objectWithDict:dict[key] withClassName:key]forKey:key];
}else{
[self setValue:dict[key] forKey:key];
}
}@catch (NSException *exception) {
NSLog(@"except:%@:%@",key,dict[key]);
}
}
return self;
}
- (NSString*) propertyClassName:(NSString*)propertyName{
return nil;
}
@end
这个demo很简单,用的还是上一篇中的例子。
NSString* jsonString = request.responseString;
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonObj = [jsonData objectFromJSONData];
Result* result = [SearchResult objectWithDict:jsonObj withClassName:@"Result"];
如果一个需要对一个json对象的解析中不存在数组之类的,就直接继承就行,什么都不用写。如果有数组的话,就需要重载
- (NSString*) propertyClassName:(NSString*)propertyName这个方法就行。这样就可以找到正确的类进行解析了。