您的位置:首页 > 移动开发 > IOS开发

iOS Json和对象互转(反射支持对象嵌套的复杂对象类型,支持基本数据类型和NSDate属性转化)

2013-11-09 16:01 946 查看
背景:

JsonKit 接收网络数据转化成NSDictionary还算好用;

之前的项目 实体类 属性字段比较少,偷懒的做法 是 遍历 dictionary 利用objectForKey 逐个对 实体对象属性赋值;

但是现在的项目开始变态了,实体非常多,而且 实体属性字段 动辄几十个,就像下面这种类型:

@interface PremiumCalculateResultDto : NSObject
@property (nonatomic, retain) NSMutableArray    *    premiumCalculateFeeList;
@property (nonatomic, retain) NSMutableArray    *    premiumCalculateCarShipTaxFeeList;
@property (nonatomic, retain) NSMutableArray    *    guCIVehiclePriceResultDtoList;
@property (nonatomic, retain) NSMutableArray    *    guCIInsureRiskItemResultDtoList;
@property (nonatomic, retain) NSMutableArray    *    guCIInsureDemandResultDtoList;


@interface PremiumCalculateFee : NSObject
@property (nonatomic, assign) double   sumInsured;
@property (nonatomic, assign) double   grossPremium;
@property (nonatomic, retain) NSString    *    riskCode;
@property (nonatomic, retain) NSMutableArray    *    premiumCalculateItemKindFeeList;
@property (nonatomic, assign) double   benchmarkPremium;
@property (nonatomic, assign) double   discount;


@interface PremiumCalculateItemKindFee : NSObject
@property (nonatomic, assign) double   adjustRate;
@property (nonatomic, assign) double   rate;
@property (nonatomic, assign) double   netPremium;
@property (nonatomic, assign) double   grossPremium;
@property (nonatomic, retain) NSString    *    riskCode;
@property (nonatomic, assign) double   deductible;
@property (nonatomic, assign) double   shortRate;
@property (nonatomic, retain) NSString    *    kindName;
@property (nonatomic, assign) double   basePremium;
@property (nonatomic, assign) double   benchmarkPremium;
@property (nonatomic, retain) NSString    *    kindCode;
@property (nonatomic, assign) double   discount;


作为一个正常人, 如何能忍受挨个遍历手动forkey....

如果曾经你也是一名java程序员,或者看过java代码, 你不难怀念 objectParser;传入json数据和对应class,直接给你返回要用的对象;

既然没有,那只能自己干!!!

首先要考虑的几个问题:

1.实体属性 类型的问题,特别是基本类型:double ,int, float等。

2.java中有泛型,而iOS却没有, 有什么办法将array中得对象class告知程序;

对于问题1.已经可以使用iOS特性KVC setObject forKey ,传入 string , 它(编译器)会自动转化成需要的类型, 要注意的是 long 一定得声明为long long;

对于问题2.需要后台严格遵守我们的约定:

传入的array类型的数据为key时候 ,命名统一为xxxxList如:

guCIInsureDemandResultDtoList =         (
{


我在截取类名时候 拼接类名 GuCIInsureDemandResultDto 然后反射为对象,判断dto实体是否有对应key的属性, 然后利用KVC对属性赋值;

此外:此外, 有些小工具是必不可少的;将Dto实体对象 转化为JSONString 然后post给服务器。算是一个与上述功能互逆的过程;之前很傻,在每个Dto里面都写了一个toDictionary方法;然后针对 属性是否为array类型做了迭代调用,将最终的Dto转化为 NSDictionary,然后利用JSONkit转化为JSONString传给服务器;

为此,由于忍受不了每个对象这么写;大量重复工作,费时费事,我还专门写了小工具一枚,将java dto实体转化为 iosDto实体的工具;

现在想来: 直接扩展NSObject, 在里面统一处理toDictionary方法,在toDictionary里面 通过访问jbj-c/runtime获取类属性和属性列表;简单的语句就可以搞定!

至此 : iOS 实体转JSONString 和 JSONString 转实体全部搞定!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐