• iOS 中JSONModel的使用


    基本使用

    涉想你的JSON数据像这样:

    { "id": "10", "country": "Germany", "dialCode": 49, "isInEurope": true }
    • 为你的数据模型创建一个Objective-C的类,继承自JSONModel.
    • 将JSON中的keys在.h文件中声明为属性:
    复制代码
    #import "JSONModel.h"
    
    @interface CountryModel : JSONModel
    
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString* country;
    @property (strong, nonatomic) NSString* dialCode;
    @property (assign, nonatomic) BOOL isInEurope;
    
    @end
    复制代码

    在.m文件中不需要做任何事情.

    • 用数据初始化你的model:
    复制代码
    #import "CountryModel.h"
    ...
    
    NSString* json = (fetch here JSON from Internet) ...
    NSError* err = nil;
    CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];
    复制代码

    举个例子

    命名自动匹配

    {
      "id": "123",
      "name": "Product name",
      "price": 12.95
    }
    复制代码
    @interface ProductModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString* name;
    @property (assign, nonatomic) float price;
    @end
    
    @implementation ProductModel
    @end
    复制代码

    模型嵌套 (模型包含其他模型)

    复制代码
    {
      "order_id": 104,
      "total_price": 13.45,
      "product" : {
        "id": "123",
        "name": "Product name",
        "price": 12.95
      }
    }
    
    @interface OrderModel : JSONModel
    @property (assign, nonatomic) int order_id;
    @property (assign, nonatomic) float total_price;
    @property (strong, nonatomic) ProductModel* product;
    @end
    
    @implementation OrderModel
    @end
    复制代码

    模型集合

    复制代码
    {
      "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
    @interface ProductModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString* name;
    @property (assign, nonatomic) float price;
    @end
    
    @implementation ProductModel
    @end
    
    @interface OrderModel : JSONModel
    @property (assign, nonatomic) int order_id;
    @property (assign, nonatomic) float total_price;
    @property (strong, nonatomic) NSArray<ProductModel>* products;
    @end
    
    @implementation OrderModel
    @end
    复制代码

    注意: 尖括号后 NSArray 包含一个协议. 这跟Objective-C原生的泛型不是一个概念. 他们不会冲突, 但对于JSONModel来说,协议必须在一个地方声明.

    key映射

    复制代码
    {
      "order_id": 104,
      "order_details" : [
        {
          "name": "Product#1",
          "price": {
            "usd": 12.95
          }
        }
      ]
    }
    
    @interface OrderModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (assign, nonatomic) float price;
    @property (strong, nonatomic) NSString* productName;
    @end
    
    @implementation OrderModel
    
    +(JSONKeyMapper*)keyMapper
    {
      return [[JSONKeyMapper alloc] initWithDictionary:@{
        @"order_id": @"id",
        @"order_details.name": @"productName",
        @"order_details.price.usd": @"price"
      }];
    }
    
    @end
    复制代码

    设置全局键映射(应用于所有model)

    复制代码
    [JSONModel setGlobalKeyMapper:[
        [JSONKeyMapper alloc] initWithDictionary:@{
          @"item_id":@"ID",
          @"item.name": @"itemName"
       }]
    ];
    复制代码

    设置下划线自动转驼峰

    {
      "order_id": 104,
      "order_product" : @"Product#1",
      "order_price" : 12.95
    }
    复制代码
    @interface OrderModel : JSONModel
    
    @property (assign, nonatomic) int orderId;
    @property (assign, nonatomic) float orderPrice;
    @property (strong, nonatomic) NSString* orderProduct;
    
    @end
    
    @implementation OrderModel
    
    +(JSONKeyMapper*)keyMapper
    {
      return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
    }
    
    @end
    复制代码

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

    {
      "id": "123",
      "name": null,
      "price": 12.95
    }
    复制代码
    @interface ProductModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString<Optional>* name;
    @property (assign, nonatomic) float price;
    @property (strong, nonatomic) NSNumber<Optional>* uuid;
    @end
    
    @implementation ProductModel
    @end
    复制代码

    忽略属性 (就是完全忽略这个属性)

    复制代码
    {
      "id": "123",
      "name": null
    }
    
    
    @interface ProductModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString<Ignore>* customProperty;
    @end
    
    @implementation ProductModel
    @end
    复制代码

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

    复制代码
    @implementation ProductModel
    +(BOOL)propertyIsOptional:(NSString*)propertyName
    {
      return YES;
    }
    @end
    复制代码

    使用JSONModel自带的 HTTP 请求

    复制代码
    //add extra headers
    [[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"];
    
    //make post, get requests
    [JSONHTTPClient postJSONFromURLWithString:@"http://mydomain.com/api"
                                       params:@{@"postParam1":@"value1"}
                                   completion:^(id json, JSONModelError *err) {
    
                                       //check err, process json ...
    
                                   }];
    复制代码

    将model转化为字典或者json格式的字符串

    复制代码
    ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
    pm.name = @"Changed Name";
    
    //convert to dictionary
    NSDictionary* dict = [pm toDictionary];
    
    //convert to text
    NSString* string = [pm toJSONString];
    复制代码

    自定义数据的转换

    复制代码
    @implementation JSONValueTransformer (CustomTransformer)
    
    - (NSDate *)NSDateFromNSString:(NSString*)string {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:APIDateFormat];
        return [formatter dateFromString:string];
    }
    
    - (NSString *)JSONObjectFromNSDate:(NSDate *)date {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:APIDateFormat];
        return [formatter stringFromDate:date];
    }
    
    @end
    复制代码

    自定义处理指定的属性

    复制代码
    @interface ProductModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString* name;
    @property (assign, nonatomic) float price;
    @property (strong, nonatomic) NSLocale *locale;
    @end
    
    @implementation ProductModel
    
    // Convert and assign the locale property
    - (void)setLocaleWithNSString:(NSString*)string {
        self.locale = [NSLocale localeWithLocaleIdentifier:string];
    }
    
    - (NSString *)JSONObjectForLocale {
        return self.locale.localeIdentifier;
    }
    
    @end
    复制代码

    自定义JSON校验

    复制代码
    @interface ProductModel : JSONModel
    @property (assign, nonatomic) int id;
    @property (strong, nonatomic) NSString* name;
    @property (assign, nonatomic) float price;
    @property (strong, nonatomic) NSLocale *locale;
    @property (strong, nonatomic) NSNumber <Ignore> *minNameLength;
    @end
    
    @implementation ProductModel
    
    - (BOOL)validate:(NSError *__autoreleasing *)error {
        BOOL valid = [super validate:error];
    
        if (self.name.length < self.minNameLength.integerValue) {
            *error = [NSError errorWithDomain:@"me.mycompany.com" code:1 userInfo:nil];
            valid = NO;
        }
    
        return valid;
    }
    
    @end
    复制代码
  • 相关阅读:
    博客园的商业模式
    读书单
    VC++学习笔记
    技术话题
    vc+学习遇到的问题
    常见的Java问题排查方法
    MSDN Library for vs 2010 下载和安装
    WT19i刷机过程
    随记
    WT19i的刷机
  • 原文地址:https://www.cnblogs.com/sunfuyou/p/7240069.html
Copyright © 2020-2023  润新知