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
- IOS之json转model
- iOS中model 转json
- iOS Json转Model (一)
- iOS & Mac JSON To Model
- iOS json转化为model
- iOS JSON Model 转换 MJExtension
- Mac iOS Json 操作Model to JSON
- ios开发-对象(model)转json,NSDictionary
- iOS:一键Model转Json或者NSDictionary
- model转json
- caffe model转json
- Json转model对象,model转json,解析json字符串
- MJExtension objectWithKeyValues json 转model
- android json解析框架 Model转json
- ios 后台返回json数据里还有数组集合时,model的配置,model套model
- iOS JSON转Model的库 MJExtension的基本使用指导
- iOS端JSON转Model链式编程框架SuperKVC用法与原理
- iOS --- 使用runtime将JSON转换成Model
- 黑马程序员——Java基础—正则表达式
- 数据库中 connect by。。start with。。
- Linux Kernel: buffers和cached的区别
- linux下gzip的压缩详解
- ACM国际大学生程序设计竞赛介绍
- IOS之json转model
- gearman简介及安装使用
- AsyncTask超时控制
- 1066.Root of AVL Tree
- openwrt编译openswan——以及交叉编译环境配置
- 浅谈 my_strlwr和my_strupr 把大写字符串转化为小写
- SQLSERVER存储过程查找数据表中某列存在空值
- 进程与线程
- SMB/CIFS协议解析(一)