jsonmodel 对象和json之间直接转换 | 您所在的位置:网站首页 › json数据转换为model › jsonmodel 对象和json之间直接转换 |
https://github.com/jsonmodel/jsonmodel http://blog.csdn.net/smking/article/details/40432287 http://blog.csdn.net/qq_30513483/article/details/51506430 SONModel快速的解析数据为Model模型,支持层级嵌套Model模型解析,指定类型自动转化,无需手动解析,一行代码搞定! 配合ESJsonFormat插件效果更佳!ESJSONFormatter_下载 ![]() 假设你的 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];如果传过来的 JSON 合法,你所定义的所有的属性都会与该 JSON 值相匹配,并且 JSONModel 也会尝试尽可能的转换成你所想要的数据,就像上面的例子: 转化 "id",从字符串转换成 int 型 拷贝 country 属性的值 转换 dialCode ,从NSNumber 转换为 NSString 值 最后一个呢是将 isInEurope 转换成 BOOL 的属性所以,你需要做的就是定义出你期望的属性就行了。 例子例子中所有Model模型都要继承JSONModel 1.命名自动匹配 Model属性名和服务器返回数据字段一致![]() ![]() 注意:NSArry后的就中包含一个协议,这并不是Objective-C的新语法,他们不会冲突,使用JSONModel必须实现这个协议! 层级嵌套,Model中包含其他Model集合,必须实现该协议 包含其他Model集合的属性需要指定层级类型和自身类型(例如: NSArray*)![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事情。 感谢GitHub的开源精神。
那我们开始吧。 先说说这两个的差别。 这两个使用的方法其实都差不多, 详细的使用方法请直接GitHub上找, 还是比较简单地。 就我个人来说JSONModel相对起来使用较为简单,而Mantle使用起来略为复杂,但是Mantle似乎比JSONModel更为强大。 一般的项目,其实使用JSONModel就已经足够。
下面讲一下JSONModel的使用方法。 @inteface MyModel : JSONModel
1. 使用JSONModel时,不需要额外去检查所要的服务器属性是否有返回。JSONModel的initWithDictionary方法会自动去进行检查并处理。
2. 有效性检查,如果指定的服务器返回的某个字段没有返回,而且又是必须的, 像下面这样写,则会抛出异常。
//this property is required @property (strong, nonatomic) NSString* string; 因为默认这个值是必须的。
一般情况下,我们不想因为服务器的某个值没有返回就使程序崩溃, 我们会加关键字Optional.
//this one's optional @property (strong, nonatomic) NSNumber* number;
3. 原子数据, 之前可能是如下面这样操作数据
if (jsonDict[@"name"]) labelName.text = jsonDict[@"name"]; else [self showErrorMessageAndBailout];
这段代码会使得jsonDict[@"name"], 会被读取,然后进行有效性判断,最后再被使用。 换句话来说,这里使用了三次, 而如果某些情况下,使用一次就已经出错,但却无法阻止它接下来的连续出错。
而如果使用JSONModel的属性,则只会保证上面只使用一次,就可以进行有效性的判断以及使用。(其实上面也可以做到,只需要把这个值取出来,存下来接着使用却可,但是代码会稍显麻烦) 同时读取一批数据如下面代码: 简单模型如下:
SimpleModel* model = [[SimpleModel alloc] initWithString:@"...json here..." error:nil]; [objc] view plain copy 复杂模型如下, 这里假设复杂模型包含了简单模型。主要是为了说明模型之前的包含情况下,照样可以进行解析。 [objc] view plain copy SuperComplicatedModel* model = [[SuperComplicatedModel alloc] initWithString:@"...json here..." error:nil]; 模型的批处理,即一次可以处理一批模型。
[objc] view plain copy NSArray* models = [SuperComplicatedModel arrayOfObjectsFromDictionaries: jsonDatas error:nil];
4. 数据转换, OC JSON 注意下面这张图:这意味着JSON的数据格式只有中间的部分, string,number, array, object, 以及null 例如有如下 JSON数据:
{ "first" : 1, "second": 35, "third" : 10034, "fourth": 10000 } 可以如下定义这个模型
[objc] view plain copy @interface NumbersModel:JSONModel
@property (assign,nonatomic) short first; @property (assign,nonatomic) double second; @property (strong,nonatomic) NSNumber* third; @property (strong,nonatomic) NSString* fourth;
@end 注:JSON数据中, first为1,second为35, 但是它们却可以自动被转换成short, double类型。 对于10034, 以及10000会自动转换为NSNumber以及NSString。 这些都是JSONModel会自动进行的。 神奇吧!
5. 内嵌的数据转换, 在JSONValueTransformer类中,有各种内嵌的转换支持。如下面
{ "purchaseDate" : "2012-11-26T10:00:01+02:00", "blogURL" : "http://www.touch-code-magazine.com" }
分别是一个 日期类型,以及一个URL类型。
@interface SmartModel: JSONModel
@property (strong, nonatomic) NSDate* purchaseDate; @property (strong, nonatomic) NSURL* blogUrl;
@end [objc] view plain copy 用上面这个模型,不需要其它代码,即可以得到想要的转换 。
这个JSONValueTransformer类中有如下支持的转换
NSMutableString NSString
NSMutableArray NSArray NS(Mutable)Array |
CopyRight 2018-2019 实验室设备网 版权所有 |