JSON数据---JSONModel解析

JSONModel 一个解析 JSON 数据的开源库,可以将 JSON 数据直接解析成自定义的 model .

使用 JSONModel 非常简单,只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常恭喜你,你的工作已经完成90%。

JSONModel 不只使用非常方便而且还会帮你检查 JSON 数据的完整性,如果 JSON 数据不完整的话是要返回 nil 的。它还提供了基本的数据类型转换,比如服务器错将数字传成字符串的话 JSONModel 也会帮你转换成你期望的类型。

添加 JSONModel 到你的工程中

Requirements:

需要的环境:

ARC,iOS 5.0+ / OSX 10.7 +

引入框架SystemConfiguration.framework

Get it as: 1) source files

Download the JSONModel repository as a zip file or clone it  

Copy the JSONModel sub-folder into your Xcode project

Link your app to SystemConfiguration.framework

     1.  下载 JSONModel zip包


     2.  将 JSONModel 文件夹拷贝到你的工程项目中


     3.  将库 SystemConfiguration.framework 添加上


or 2) via Cocoa pods

In your project's Podfile add the JSONModel pod:


使用 Cocoa pods 来安装:


pod ‘JSONModel'

接下来简单介绍一下 JSONModel的一些常规使用法则 

1. JSONModel自带有 有效性检查,如果指定的服务器返回的某个字段没有返回值,而且该又是必须的, 像下面这样写,则会抛出异常


@property (nonatomic, strong) NSString *Nothing;


一般情况下,我们不想因为服务器的某个值没有返回就使程序崩溃, 我们会加关键字Optional.


@property (nonatomic, strong) NSString <Optional>*Nothing;


2.如果传过来的 JSON 合法,你所定义的所有的属性都会与该 JSON 值相匹配,并且 JSONModel 也会尝试尽可能的转换成你所想要的数据:


// 本来是NSInteger类型直接给转换为 NSString

@property (nonatomic, strong) NSString *city_id;


3自动把下划线方式的命名转为驼峰命名属性。还有类似的,如大写转为小写的方法


@property (nonatomic, strong) NSString *city_name;

// 在.m文件中写上这个方法

+(JSONKeyMapper*)keyMapper

{

    return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];

}

@property (nonatomic, strong) NSString *cityName;

eg:

假设你的 JSON 串像下面这样子:


{"id":"10", "country":"Germany", "dialCode": 49, "isInEurope":true}

创建一个你自己的类,并继承至 JSONModel

在你的头文件里面进行声明你所需要的 JSON key值

#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];

model中含有其他model的集合

{

  "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

键值转回匹配


{

  "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

设置全局的键值转回匹配


[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

 内嵌的数据转换, 在JSONValueTransformer类中,有各种内嵌的转换支持。如下面

{

    "purchaseDate" : "2012-11-26T10:00:01+02:00",

    "blogURL" : "http://www.touch-code-magazine.com"

}


分别是一个 日期类型,以及一个URL类型。

@interface SmartModel: JSONModel


@property (strongnonatomicNSDate* purchaseDate;

@property (strongnonatomicNSURL* blogUrl;


@end


JSONModel处理数据问题 
请求网址: http://api.lanrenzhoumo.com/district/list/allcity?session_id=00004016b3e14bbea40c1aa1a14c2273a35352 
请求数据类型 
这里写图片描述

 


// 方式一

创建一个model 继承JSONModel 声明自己想要的key 在解析数据时我们可以直接使用下面的方法 根据字典创建mode

 AmbitusCityTypeModel *model = [[AmbitusCityTypeModel alloc] initWithDictionary:dic error:nil];

 // initWithDictionary方法

 相当于正常解析时 创建model kvc赋值

//方式二

//根据字典的数组创建model的数组 得到的数组里面都是model类型的数据 

  self.dataArray = [LoanModel arrayOfModelsFromDictionaries:tempArr];


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值