JSONModel的使用

coverImage.jpg

1. 命名自动匹配

a. Model属性名和服务器返回数据字段一致

{
    @"id":"123",
    @"name":"巧克力",
    @"price":"6.66"
}

  @interface ProductModel : BaseModel
  @property (nonatomic, strong) NSString *id;
  @property (nonatomic, strong) NSString *name;
  @property (nonatomic, assign) float     price;

  @end

2. Model关联(model含有其它model)

a. Model属性名和服务器返回数据一致;
b. 关联其它Model的属性需要指定自身类型(例如:ProductModel *)

  {
      “order_id”:104,
      “total_price”:110,
      “product”: {
           “id”:”123”,
           “name”:”productName”,
           “price”:”110”,
      }
  }

  @interface OrderModel : BaseModel
  @property (nonatomic, strong) NSString     *order_id;
  @property (nonatomic, assign) float        total_price;
  @property (nonatomic, strong) ProductModel *product;

  @end

3. Model集合(Model含有其它model的集合)

a. NSArry后的就<>中包含一个协议,使用JSONModel必须实现这个协议!
b. 层级嵌套,Model中包含其他Model集合,必须实现该协议
c. 包含其他Model集合的属性需要指定层级类型和自身类型(例如:NSArray<ProductModel> *)

 @protocol ProductModel
 @end
 @interface OrderModel : JSONModel
 @property (nonatomic, strong) NSString *order_id;
 @property (nonatomic, assign) float     total_price;
 @property (nonatomic, strong) NSArray<ProductModel> *products;

 @end

4. 键映射

a. 在一个Model中获取服务器返回数据不同层级的数据;
b. 例如:order_id和name不在同一层级;
c. 采用KVC的方式来取值,并赋值给Model属性(order_details.name ---> productName order_details.price.usd ---> price);

 {
   "order_id": 104,
   "order_details" : [
     {
       "name": "name_#1",
       "price": {
         "usd": 12.95
       }
     }
   ]
 }

@interface OrderModel : BaseModel
@property (nonatomic, strong) NSString *id;
@property (nonatomic, assign) float    price;
@property (nonatomic, strong) NSString *productName;
@end
@implementation OrderModel
+ (JSONKeyMapper *)keyMapper 
{
    return [[JSONKeyMapper alloc] initWithDictionary:@{
                                        @"order_id": @"id",
@"order_details.name": @"productName",                                                                  @"order_details.price.usd": @"price"}];
}

@end

d.全局Global key mapping. (使所有的模型都具备)

JSONKeyMapper *keyMapper = [[JSONKeyMapper alloc] initWithDictionary:@{@"id":@"modelId"}];
[BaseModel setGlobalKeyMapper:keyMapper];

5. 设置下划线自动转驼峰

a. 自定义把下划线字段解析为驼峰命名属性
b. 场景:服务器数据返回下划线命名字段可为Model中以驼峰命名的属性相应的赋值
c. mapperFromUpperCaseToLowerCase 大写转小写

 {
   "order_id": 104,
   "order_product" : @"Product#1",
   "order_price" : 12.95
 }

@interface OrderModel : BaseModel
@property (nonatomic, strong) NSString *orderId;
@property (nonatomic, assign) float     orderPrice;
@property (nonatomic, strong) NSString *orderProduct;

@end

@implementation OrderModel
+ (JSONKeyMapper *)keyMapper
{
    return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}

@end

6. 可选属性(属性值可以为空或null)

a. 某些属性值可以为空;
b. 防止由于服务器返回数据为空导致JSONModel异常(程序崩溃);

eg: @property (nonatomic, strong) NSString<Optional> *urlString;

7. 忽略属性(属性值可以完全忽略)

a. 解析时完全忽略它;
b. 场景:该属性不需要从服务器数据中获取;

 eg: @property (nonatomic, strong) NSString<Ignore> *urlString;

8. 设置所有属性可选(所有属性值可以为空)

a. Model 的所有属性值可以为空;
b. 防止由于服务器数据返回空导致JSONModel异常(程序崩溃);
c. 官方建议尽量避免使用该方法(即使要全部属性为可选,也尽量是在每个属性那里标注为Optional);

eg: 
@implementation HomeHotModel
+ (BOOL)propertyIsOptional:(NSString *)propertyName 
{
    return YES;
}
@end

9. 将Model导出字典或JSON字符串

a. 快速导出Model中所有属性和属性值;

 eg:
 HomeHotModel *model = [[HomeHotModel alloc] initWithString:jsonString  error:nil];
 //以字典形式导出
 NSDictionary *dict = [model toDictionary];
 //以字符串形式导出
 NSString *string = [model toJSONString];

10. 自定义数据处理(JSON数据格式:string, number, array, object, 以及null)

a. 添加NSDate转换:根据后台返回时间戳格式进行相应处理(eg:UIColor);
b. 场景:内嵌转换,不能满足需求,需要自定义;
c. JSONModel支持类型如下图:

JSONModel支持类型.png
eg:
#import "JSONValueTransformer+CustomTransformer.h"
@implementation JSONValueTransformer (CustomTransformer)
//时间戳转NSDate
- (NSDate *)NSDateFromNSString:(NSString *)string
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = [formatter dateFromString:string];
    return date;
}

//NSDate转时间戳
- (NSString *)JSONObjectFromNSDate:(NSDate *)date
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSString *dateStr = [formatter stringFromDate:date];
    return dateStr;
}

@end

11. 延迟加载, 这种比较推荐,可以减少在网络读取时的性能消耗,关键字为: ConvertOnDemand

{
    "order_id": 104,
    "total_price": 103.45,
    "products" : [
                  {
                      "id": "123",
                      "name": "Product #1",
                      "price": 12.95
                  },
                  {
                      "id": "137",
                      "name": "Product #2",
                      "price": 82.95
                  }
                  ]
}

使用模型:
@protocol ProductModel
@end

//产品Model
@interface ProductModel : JSONModel
@property (nonatomic, strong) NSString *id;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) float     price;
@end

//订单Model
@interface OrderModel : JSONModel
@property (nonatomic, strong) NSString *order_id;
@property (nonatomic, assign) float    total_price;
@property (nonatomic, strong) NSArray<ProductModel, ConvertOnDemand> *products;
@end

12. 模型的批处理,即一次可以处理一批模型

NSArray *models = [OrderModel arrayOfObjectsFromDictionaries:jsonDatas error:nil];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容