基本使用

涉想你的JSON数据像这样:

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

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

  • 用数据初始化你的model:
  1. #import "CountryModel.h"
  2. ...
  3.  
  4. NSString* json = (fetch here JSON from Internet) ...
  5. NSError* err = nil;
  6. CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];

举个例子

命名自动匹配

  1. {
  2. "id": "123",
  3. "name": "Product name",
  4. "price": 12.95
  5. }
  1. @interface ProductModel : JSONModel
  2. @property (assign, nonatomic) int id;
  3. @property (strong, nonatomic) NSString* name;
  4. @property (assign, nonatomic) float price;
  5. @end
  6.  
  7. @implementation ProductModel
  8. @end

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

  1. {
  2. "order_id": 104,
  3. "total_price": 13.45,
  4. "product" : {
  5. "id": "123",
  6. "name": "Product name",
  7. "price": 12.95
  8. }
  9. }
  10.  
  11. @interface OrderModel : JSONModel
  12. @property (assign, nonatomic) int order_id;
  13. @property (assign, nonatomic) float total_price;
  14. @property (strong, nonatomic) ProductModel* product;
  15. @end
  16.  
  17. @implementation OrderModel
  18. @end

模型集合

  1. {
  2. "order_id": 104,
  3. "total_price": 103.45,
  4. "products" : [
  5. {
  6. "id": "123",
  7. "name": "Product #1",
  8. "price": 12.95
  9. },
  10. {
  11. "id": "137",
  12. "name": "Product #2",
  13. "price": 82.95
  14. }
  15. ]
  16. }
  1. @protocol ProductModel
  2. @end
  3. @interface ProductModel : JSONModel
  4. @property (assign, nonatomic) int id;
  5. @property (strong, nonatomic) NSString* name;
  6. @property (assign, nonatomic) float price;
  7. @end
  8.  
  9. @implementation ProductModel
  10. @end
  11.  
  12. @interface OrderModel : JSONModel
  13. @property (assign, nonatomic) int order_id;
  14. @property (assign, nonatomic) float total_price;
  15. @property (strong, nonatomic) NSArray<ProductModel>* products;
  16. @end
  17.  
  18. @implementation OrderModel
  19. @end

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

key映射

  1. {
  2. "order_id": 104,
  3. "order_details" : [
  4. {
  5. "name": "Product#1",
  6. "price": {
  7. "usd": 12.95
  8. }
  9. }
  10. ]
  11. }
  12.  
  13. @interface OrderModel : JSONModel
  14. @property (assign, nonatomic) int id;
  15. @property (assign, nonatomic) float price;
  16. @property (strong, nonatomic) NSString* productName;
  17. @end
  18.  
  19. @implementation OrderModel
  20.  
  21. +(JSONKeyMapper*)keyMapper
  22. {
  23. return [[JSONKeyMapper alloc] initWithDictionary:@{
  24. @"order_id": @"id",
  25. @"order_details.name": @"productName",
  26. @"order_details.price.usd": @"price"
  27. }];
  28. }
  29.  
  30. @end

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

  1. [JSONModel setGlobalKeyMapper:[
  2. [JSONKeyMapper alloc] initWithDictionary:@{
  3. @"item_id":@"ID",
  4. @"item.name": @"itemName"
  5. }]
  6. ];

设置下划线自动转驼峰

  1. {
  2. "order_id": 104,
  3. "order_product" : @"Product#1",
  4. "order_price" : 12.95
  5. }
  1. @interface OrderModel : JSONModel
  2.  
  3. @property (assign, nonatomic) int orderId;
  4. @property (assign, nonatomic) float orderPrice;
  5. @property (strong, nonatomic) NSString* orderProduct;
  6.  
  7. @end
  8.  
  9. @implementation OrderModel
  10.  
  11. +(JSONKeyMapper*)keyMapper
  12. {
  13. return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
  14. }
  15.  
  16. @end

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

  1. {
  2. "id": "123",
  3. "name": null,
  4. "price": 12.95
  5. }
  1. @interface ProductModel : JSONModel
  2. @property (assign, nonatomic) int id;
  3. @property (strong, nonatomic) NSString<Optional>* name;
  4. @property (assign, nonatomic) float price;
  5. @property (strong, nonatomic) NSNumber<Optional>* uuid;
  6. @end
  7.  
  8. @implementation ProductModel
  9. @end

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

  1. {
  2. "id": "123",
  3. "name": null
  4. }
  5.  
  6. @interface ProductModel : JSONModel
  7. @property (assign, nonatomic) int id;
  8. @property (strong, nonatomic) NSString<Ignore>* customProperty;
  9. @end
  10.  
  11. @implementation ProductModel
  12. @end

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

  1. @implementation ProductModel
  2. +(BOOL)propertyIsOptional:(NSString*)propertyName
  3. {
  4. return YES;
  5. }
  6. @end

使用JSONModel自带的 HTTP 请求

  1. //add extra headers
  2. [[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"];
  3.  
  4. //make post, get requests
  5. [JSONHTTPClient postJSONFromURLWithString:@"http://mydomain.com/api"
  6. params:@{@"postParam1":@"value1"}
  7. completion:^(id json, JSONModelError *err) {
  8.  
  9. //check err, process json ...
  10.  
  11. }];

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

  1. ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
  2. pm.name = @"Changed Name";
  3.  
  4. //convert to dictionary
  5. NSDictionary* dict = [pm toDictionary];
  6.  
  7. //convert to text
  8. NSString* string = [pm toJSONString];

自定义数据的转换

  1. @implementation JSONValueTransformer (CustomTransformer)
  2.  
  3. - (NSDate *)NSDateFromNSString:(NSString*)string {
  4. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  5. [formatter setDateFormat:APIDateFormat];
  6. return [formatter dateFromString:string];
  7. }
  8.  
  9. - (NSString *)JSONObjectFromNSDate:(NSDate *)date {
  10. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  11. [formatter setDateFormat:APIDateFormat];
  12. return [formatter stringFromDate:date];
  13. }
  14.  
  15. @end

自定义处理指定的属性

  1. @interface ProductModel : JSONModel
  2. @property (assign, nonatomic) int id;
  3. @property (strong, nonatomic) NSString* name;
  4. @property (assign, nonatomic) float price;
  5. @property (strong, nonatomic) NSLocale *locale;
  6. @end
  7.  
  8. @implementation ProductModel
  9.  
  10. // Convert and assign the locale property
  11. - (void)setLocaleWithNSString:(NSString*)string {
  12. self.locale = [NSLocale localeWithLocaleIdentifier:string];
  13. }
  14.  
  15. - (NSString *)JSONObjectForLocale {
  16. return self.locale.localeIdentifier;
  17. }
  18.  
  19. @end

自定义JSON校验

  1. @interface ProductModel : JSONModel
  2. @property (assign, nonatomic) int id;
  3. @property (strong, nonatomic) NSString* name;
  4. @property (assign, nonatomic) float price;
  5. @property (strong, nonatomic) NSLocale *locale;
  6. @property (strong, nonatomic) NSNumber <Ignore> *minNameLength;
  7. @end
  8.  
  9. @implementation ProductModel
  10.  
  11. - (BOOL)validate:(NSError *__autoreleasing *)error {
  12. BOOL valid = [super validate:error];
  13.  
  14. if (self.name.length < self.minNameLength.integerValue) {
  15. *error = [NSError errorWithDomain:@"me.mycompany.com" code:1 userInfo:nil];
  16. valid = NO;
  17. }
  18.  
  19. return valid;
  20. }
  21.  
  22. @end

iOS 中JSONModel的使用的更多相关文章

  1. iOS中JSONModel的使用

    iOS中JSONModel的使用   流弊的JSON数据模型框架 https://github.com/jsonmodel/jsonmodel 版本 1.3.0 如果你喜欢JSONModel,并且使用 ...

  2. iOS 中有用的开源库

    youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...

  3. iOS 中 常用的第三方库

    现在对于我们 iOS 开发来说,基本上说不可能不使用第三方轮子啦,毕竟没那么多时间,而且自己造的轮子往往想着成为上图中的最后一个,结果却成了上图中第二个或第一个啦,当然大公司另当别论.下面我从之前用过 ...

  4. iOS中支付宝集成

    iOS中支付宝集成 如今各种的App中都使用了三方支付的功能,现在将我在使用支付宝支付集成过程的心得分享一下,希望对大家都能有所帮助 要集成一个支付宝支付过程的环境,大致需要: 1>公司:先与支 ...

  5. iOS中数据库应用基础

    iOS 数据库入门 一.数据库简介 1.什么是数据库? 数据库(Database) 是按照数据结构来组织,存储和管理数据的仓库 数据库可以分为2大种类 关系型数据库(主流) PC端 Oracle My ...

  6. 正则表达式在iOS中的运用

    1.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  7. iOS 中的 HotFix 方案总结详解

    相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dynamic Framework(Ap ...

  8. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  9. IOS中div contenteditable=true无法输入

    在IOS中<div contenteditable="true"></div>中点击时可以弹出键盘但是无法输入.加一个样式-webkit-user-sele ...

随机推荐

  1. PHP中使用 JKS(Java Key Store)的方法

    PHP语言无法直接读取 JKS中的密钥,需要通过以下方法进行转换 本例以JKS中的私钥为例 首先 使用 KeyStore Explorer工具,打开JKS文件 ,此时可能需要输入 JKS密码 对私钥进 ...

  2. Swift 多态

    前言 同样的操作或者方法,不同的对象在执行时会出现完全不同的行为,这就叫多态. 1.Swift 多态 多态是讲具有同样的父类的一批类之间,都重写了父类的同一个方法实现自己的行为,但是表现出来则各不相同 ...

  3. [译]async/await中使用阻塞式代码导致死锁 百万数据排序:优化的选择排序(堆排序)

    [译]async/await中使用阻塞式代码导致死锁 这篇博文主要是讲解在async/await中使用阻塞式代码导致死锁的问题,以及如何避免出现这种死锁.内容主要是从作者Stephen Cleary的 ...

  4. Easyui中 messager出现的位置

    $.messager.alert 弹出框的位置随页面的长度越大越靠下. $.messager.alert('消息','只能对单个客户进行清款!','info'); 弹出的位置 太靠下方.修改为: $. ...

  5. openkm预览功能报错:flexpaper License key not accepted(no key passed to viewer)

    openkm:6.3.4 使用google浏览器打开,想预览文件,但是pdf.word和图片都不能显示.只是显示空白. 换成IE后,再次尝试,发现了报错信息: 解决方案: 1- Stop openkm ...

  6. Redis 的安装与使用(单节点)

    Redis 的安装与使用(单节点)   环境:CentOS 6.5 Redis 版本:redis-3.0 (考虑到Redis3.0 在集群和性能提升方面的特性,rc 版为正式版的候选版,而且 很快就出 ...

  7. nginx+php-fpm性能参数优化原则

    1.worker_processes 越大越好(一定数量后性能增加不明显)   2.worker_cpu_affinity 所有cpu平分worker_processes 要比每个worker_pro ...

  8. pthread编译时报错的解决方法

    最近在学习POSIX thread编程,今天编译一个程序报如下错误: /tmp/ccXH8mJy.o:在函数‘main’中:deadlock.c:(.text+0xbb):对‘pthread_crea ...

  9. Android Studio 环境搭建参考,jdk10javac命令提示不是内部或外部命令

    https://blog.csdn.net/qq_33658730/article/details/78547789 win10下Android Studio和SDK下载.安装和环境变量配置 http ...

  10. JEECG中t:dictSelect的extendJson用法

    1.t:dictSelect的各个属性值如下: 属性名 类型 描述 是否必须 默认值 title string 标题 否 null field string 控件字段名字 是 null typeGro ...