ios中解析json对象基类

这个是对上面一篇写的一个解析json对象的基类

 

[objc][/objc] view plaincopy

  1. @interface BaseObjectFromJson : NSObject
  2. + (id) objectWithDict:(NSDictionary*)dict withClassName:(NSString*)className;
  3. + (NSArray*) objectsWithArray:(NSArray*)array withClassName:(NSString*)className;
  4. – (id) initWithDict:(NSDictionary*)dict;
  5. – (NSString*) propertyClassName:(NSString*)propertyName;
  6. @end

 

[objc][/objc] view plaincopy

  1. //
  2. //  BaseObjectFromJson.m
  3. //  xxoo
  4. //
  5. //  Created by Tommy on 13-11-5.
  6. //  Copyright (c) 2013年 Tommy. All rights reserved.
  7. //
  8. #import “BaseObjectFromJson.h”
  9. #import “objcUtils.h”
  10. @implementation BaseObjectFromJson
  11. + (id) objectWithDict:(NSDictionary*)dict withClassName:(NSString*)className{
  12.     Class objClass = NSClassFromString(className);
  13.     BaseObjectFromJson* object = nil;
  14.     if(objClass){
  15.         object = [[objClass alloc] initWithDict:dict];
  16.     }else{
  17.         NSAssert(0, @”Unknown class:%@”,className);
  18.     }
  19.     return object;
  20. }
  21. + (NSArray*) objectsWithArray:(NSArray*)array withClassName:(NSString*)className{
  22.     Class objClass = NSClassFromString(className);
  23.     BaseObjectFromJson* object = nil;
  24.     NSMutableArray* objArray = nil;
  25.     if(objClass){
  26.         objArray = [NSMutableArray new];
  27.         for (NSDictionary* dict in array){
  28.             object = [[objClass alloc] initWithDict:dict];
  29.             [objArray addObject:object];
  30.         }
  31.     }else{
  32.         NSAssert(0, @”Unknown class:%@”,className);
  33.     }
  34.     return objArray;
  35. }
  36. – (NSString*) description{
  37.     NSMutableString* desc = [NSMutableString new];
  38.     NSArray* propertyArray = getPropertyNameList(self);
  39.     [desc appendString:@”{\r”];
  40.     for (NSString* key in propertyArray) {
  41.         [desc appendFormat:@”  %@ : %@\r”,key,[self valueForKey:key]];
  42.     }
  43.     [desc appendString:@”\r}”];
  44.     return desc ;
  45. }
  46. – (id) initWithDict:(NSDictionary*)dict{
  47.     NSArray* propertyArray = getPropertyNameList(self);
  48.     for (NSString* key in propertyArray) {
  49.         @try{
  50.             if([dict[key] isKindOfClass:[NSArray class]]){
  51.                 NSString* className = [self propertyClassName:key];
  52.                 NSArray* array = [BaseObjectFromJson objectsWithArray:dict[key] withClassName:className?className:key];
  53.                 [self setValue:array forKey:key];
  54.             }else if([dict[key] isKindOfClass:[NSDictionary class]]){
  55.                 [self setValue:[BaseObjectFromJson objectWithDict:dict[key] withClassName:key]forKey:key];
  56.             }else{
  57.                 [self setValue:dict[key] forKey:key];
  58.             }
  59.         }@catch (NSException *exception) {
  60.             NSLog(@”except:%@:%@”,key,dict[key]);
  61.         }
  62.     }
  63.     return self;
  64. }
  65. – (NSString*) propertyClassName:(NSString*)propertyName{
  66.     return nil;
  67. }
  68. @end

 

 

 

 

[objc][/objc] view plaincopy

  1. 这个demo很简单,用的还是上一篇中的例子。
[objc][/objc] view plaincopy

  1. NSString* jsonString = request.responseString;
  2. NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  3. NSDictionary *jsonObj = [jsonData objectFromJSONData];
  4. Result* result = [SearchResult objectWithDict:jsonObj withClassName:@”Result”];

 

如果一个需要对一个json对象的解析中不存在数组之类的,就直接继承就行,什么都不用写。如果有数组的话,就需要重载

[objc][/objc] view plaincopy

  1. – (NSString*) propertyClassName:(NSString*)propertyName这个方法就行。这样就可以找到正确的类进行解析了。

标签