IOS之json转model

来源:互联网 发布:ios10gamecenter数据 编辑:程序博客网 时间:2024/05/29 16:28

项目需要将json格式的字符串转换成易于维护的model类,也找过别人写的,大致思想都是遍历model来实现,逻辑很复杂,也耗性能!

以前的实现是将json遍历,所以将以前在android上写的一段翻译成oc!代码如下:


//

//  HsBaseEntity+entity.h

//  JsonToEntity

//

//  Created by 王金东 on 15/1/1.

//  Copyright (c) 2015 王金东. All rights reserved.

//


#import "HsBaseEntity.h"


@interface HsBaseEntity (entity)


+ (id)objectWithData:(id)data;


@end



//

//  HsBaseEntity+entity.m

//  JsonToEntity

//

//  Created by 王金东 on 15/1/1.

//  Copyright (c) 2015 王金东. All rights reserved.

//


#import "HsBaseEntity+entity.h"

#import <objc/runtime.h>


@implementation HsBaseEntity (entity)


+ (id)objectWithData:(id)data{

   if([data isKindOfClass:[NSDictionaryclass]]){

       return [selfdictionaryToEntity:data];

    }elseif([data isKindOfClass:[NSArrayclass]]){

       return [selfarrayToEntity:data];

    }

    return nil;

}


+ (instancetype)dictionaryToEntity:(NSDictionary *)dictionary{

   id model = [[selfalloc] init];

    return [modeltransformDictionaryToEntity:dictionary];

}


+ (NSMutableArray *)arrayToEntity:(NSArray *)array{

    NSMutableArray *entityArray = [NSMutableArrayarrayWithCapacity:array.count];

   for (NSDictionary *dictionaryin array) {

       id model = [[selfalloc] init];

        [entityArrayaddObject:[model transformDictionaryToEntity:dictionary]];

    }

   return entityArray;

}


- (instancetype)transformDictionaryToEntity:(NSDictionary *)dictionary{

   NSEnumerator *enumerator = [dictionary keyEnumerator];

   NSString *key;

   while ((key = [enumerator nextObject])) {

       id value = dictionary[key];

       if ([value isKindOfClass:[NSNullclass]]) {

           continue;

        }

        

       if([value isKindOfClass:[NSArrayclass]]){//判断该属性的值是不是数组

            Class objectClass =nil;

            

           if([self exsitWithKey:key]){//判断key是否存在

               //处理key

                NSString *keyArray = [keystringByReplacingOccurrencesOfString:self.arraySuffixwithString:@""];

               NSString *firstLetterCap=[[keyArray substringToIndex:1] capitalizedString];

               NSString *modelKeyArray=[keyArray stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:firstLetterCap];

     

                objectClass =NSClassFromString(modelKeyArray);

               if (objectClass) {

                   NSString *message = [NSStringstringWithFormat:@"%@不是HsBaseEntity的子类",modelKeyArray];

                   NSAssert([objectClass isSubclassOfClass:[HsBaseEntity class]], message);

                    value = [objectClassarrayToEntity:value];

                }

            }

            

           if (objectClass == nil && [self respondsToSelector:NSSelectorFromString(@"objectClassInArray")]){

               //处理数组里面有模型的情况

                

               NSDictionary *objectClassDic = [selfperformSelector:NSSelectorFromString(@"objectClassInArray")];

                

               if(objectClassDic)

                    objectClass = objectClassDic[key];

                

               if (objectClass)

                    value = [objectClassarrayToEntity:value];

            }

            

        }elseif ([value isKindOfClass:[NSDictionaryclass]]) {//判断该属性是否是自定义对象

            Class keyClass = [selfclassWithKey:key];

            value = [keyClassdictionaryToEntity:value];

        }

        

        [selfsetValue:value forKey:key];

    }

    

    return self;

}


//判断是否存在

- (BOOL)exsitWithKey:(NSString *)key{

   const char *charKey =  [[NSStringstringWithFormat:@"_%@",key]UTF8String];

    Ivar ivar =class_getInstanceVariable([selfclass],charKey);

   if(ivar != nil){

       return YES;

    }

    return NO;

}


//根据key获取字段类型

- (Class)classWithKey:(NSString *)key{

   const char *charKey =  [[NSStringstringWithFormat:@"_%@",key]UTF8String];

    Ivar ivar =class_getInstanceVariable([selfclass],charKey);

    NSString *code = [NSStringstringWithUTF8String:ivar_getTypeEncoding(ivar)];

    //去掉@"",截取中间的类型名称

    code = [codesubstringFromIndex:2];

    code = [codesubstringToIndex:code.length -1];

    returnNSClassFromString(code);

}


@end




顺便贴上HsBaseEntity类的代码:

//

//  HsBaseEntity.h

// 

//

//  Created by 123 on 14-6-13.

//  Copyright (c) 2014 chenjiong. All rights reserved.

//


#import <Foundation/Foundation.h>



@interface HsBaseEntity :NSObject


@property (nonatomic,strong)NSString *arraySuffix;


- (NSDictionary *)objectClassInArray;


@end



//

//  HsBaseEntity.m

// 

//

//  Created by 123 on 14-6-13.

//  Copyright (c) 2014 chenjiong. All rights reserved.

//


#import "HsBaseEntity.h"


@implementation HsBaseEntity


- (instancetype)init{

   self = [superinit];

   if (self) {

       //建议统一后缀

       self.arraySuffix =@"Array";

        //如果后缀不同意,变量前缀是一个不存在的对象则建议使用objectClassInArray方法,自己用映射

    }

    return self;

}


- (void)setValue:(id)value forUndefinedKey:(NSString *)key{

    NSLog(@"undefinedKey:%@",key);

}


- (NSDictionary *)objectClassInArray{

    return nil;

}


@end







0 0