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

背景:

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 转实体全部搞定!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章