zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [Alibaba微服务技术入门]_服务配置中心进阶_第6讲
    [Alibaba微服务技术入门]_服务配置中心入门_第5讲
    [Alibaba微服务技术入门]_整合OpenFeign实现远程调度_第4讲
    [Alibaba微服务技术入门]_服务的消费_第3讲
    CSS居中对齐终极指南
    13 条高效实用的 JavaScript 单行代码
    写个锤子JS!它应该是你最后的选择
    Vue.js 实现的 3D Tab菜单
    15个超强悍的CSS3圆盘时钟动画赏析
    Node.js 安全指南
  • 原文地址:https://www.cnblogs.com/WJJ-Dream/p/6400386.html
Copyright © 2011-2022 走看看