简介——什么是JSONModel

首先我们要了解JSONModel并学会如何使用JSONModel我们就必须要知道JSONModel到底是什么:JSONModel是快速方便的把JSON数据转化为ObjectiveC的数据类型,是json转model的第三方开源库。当我们向服务器发送一个请求之后,通过JSONModel把数据转成model中的属性就可以很方便的供给我们使用了。

使用方法

首先我们知道JSONModel是第三方开源库,我们要用第三方库的话就先添加一个第三库,如何添加第三方库具体看这篇:iOS安装CocoaPods详细过程

JSON转化为模型

//JSON
{    "country": "Germany",
    "dialCode": 49,
    "isInEurope": true
 }
//Model
#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface CountryModel : JSONModel

@property (nonatomic, copy) NSString *country;
@property (nonatomic, copy) NSString *dialCode;

@property (nonatomic, assign) BOOL isInEurope;

@end

NS_ASSUME_NONNULL_END
//JSON转换为模型
NSError *error;
CountryModel *countryModel = [[CountryModel alloc] initWithDictionary:dic error:&error];

模型转化为字典

//将模型快速转换为字典
NSDictionary *dict = [countryModel toDictionary];

模型转化为字符串

//将模型快速转换为字符串
NSString *string = [countryModel toJSONString];

嵌套模型的数据解析

我们知道在发送网络请求后会出现模型套模型的情况,那这时我们应该如何去解析数据呢,简单的来说我们可以对每一个要嵌套的都写成一个类,但这并不是说要写成多个类文件,而是将所有的写到一个类文件中。比如:

//JSON
"orderId": 104,
"totalPrice": 13.45,
"product": {
"id": 123,
"name": "Product name",
"price": 12.95
}
//Model
//.h
#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface ProductModel : JSONModel

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *id;

@property (nonatomic, assign) float price;

@end

@interface OtherModel : JSONModel

@property (nonatomic, assign) NSInteger orderId;
@property (nonatomic, assign) float totalPrice;

@property (nonatomic, strong) ProductModel *product;

@end

NS_ASSUME_NONNULL_END
//.m
#import "ProductModel.h"

@implementation ProductModel

@end

@implementation OtherModel

@end
//模型套模型的例子
NSDictionary *dic = @{
                      @"orderId": @(104),
                      @"totalPrice": @(13.45),
                      @"product": @{
                          @"id": @(123),
                          @"name": @"Product name",
                          @"price": @(12.95)
                      }
                      };

NSError *error;
OtherModel *model = [[OtherModel alloc] initWithDictionary:dic error:&error];


可选属性 (就是说这个属性可以为null或者为空)

//JSON
{
  "id": "123",
  "name": null,
  "price": 12.95
}
//Model
@interface ProductModel : JSONModel

@property (nonatomic, copy) NSString <Optional>*name;
@property (nonatomic, copy) NSString *id;

@property (nonatomic, assign) float price;

@property (strong, nonatomic) NSNumber<Optional>* uuid;

@end
//可选属性(就是说这个属性可以为null或者为空)
NSDictionary *dic = @{
                      @"id": @"123",
                      @"name": [NSNull null],
                      @"price": @(12.95)
                      };

NSError *error;
ProductModel *model = [[ProductModel alloc] initWithDictionary:dic error:&error];

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

@implementation ProductModel
+(BOOL)propertyIsOptional:(NSString*)propertyName
{
  return YES;
}
@end
  1. Model 的所有属性值可以为空;
  2. . 防止由于服务器数据返回空导致JSONModel异常(程序崩溃)
  3. 官方建议尽量避免使用该方法(即使要全部属性为可选,也尽量是在每个属性那里标注为Optional);

设置下划线自动转驼峰

//JSON
{
  "order_id": 104,
  "order_product" : @"Product#1",
  "order_price" : 12.95
}
//Model
//.h
#import "JSONModel.h"

NS_ASSUME_NONNULL_BEGIN

@interface OrderModel : JSONModel

@property (assign, nonatomic) int orderId;
@property (assign, nonatomic) float orderPrice;
@property (strong, nonatomic) NSString* orderProduct;

@end

NS_ASSUME_NONNULL_END
//.m
+(JSONKeyMapper*)keyMapper
{
    return [JSONKeyMapper mapperForSnakeCase];
}
//设置下划线自动转驼峰
NSDictionary *dic = @{
    @"order_id": @(104),
    @"order_product" : @"Product#1",
    @"order_price" : @(12.95)
    };

NSError *error;
OrderModel *model = [[OrderModel alloc] initWithDictionary:dic error:&error];


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐