关于iOS上的对象映射公用方法-备

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于iOS上的对象映射公用方法-备相关的知识,希望对你有一定的参考价值。

具体的使用方法,请见下面说明,或者见工程里的单元测试代码。或者,参考原始文档:

https://github.com/mystcolor/JTObjectMapping

 

 

使用方法

========

 

绝大多数情况下,需要用到的就是一个方法:

[NSObject objectFromJSONObject:stateObject mapping:nil];

其中,把NSObject换成我们想映射成的类的名字。

 

稍微复杂一点,假设类的属性和JSON里的key名字不是一一对应的,那么就要写一个映射关系表作为mapping参数:

    NSDictionary *mapping = [NSDictionary dictionaryWithObjectsAndKeys:

                             @"myState", @"state",

                             @"movieList", @"movie",

                             nil];

    [NSObject objectFromJSONObject:stateObject mapping:mapping];

 

如果再复杂一点,我们需要映射一个数组,数组的每个元素映射到一个对象,那么就用到第2个方法:

[NSObject mappingWithKey:@"responseState" mapping:nil]

同样,把NSObject换成数组元素对应的类,key是用来存放整个数组的那个属性。

 

 

注意

====

JSON里的字符串,是能自动映射成NSNumber或者int型的,不需要特别写代码。如果想把一个字符串日期,映射成NSDate型,请参考原始文档。

 

 

具体举个例子

===========

 

假设我们有这样一段JSON:

 

 {

 "state":[

 {

 "respCode":"0000",

 "respMsg":"1"

 }

 ],

 "movie":[

 {

 "body":"    一开始,这只是叶问的故事他生于佛山",

 "pics":"/images/jz/4779-1-20121225133147.jpg,/images/jz/4779-2-20121225133147.jpg",

 "name":"一代宗师",

 "movid":"4779",

 "length":"120",

 "hasplan":"1",

 "trailor":"/4779.m4v",

 "director":"梁朝伟 章子怡 张震 ",

 "type":"动作/传记/剧情/IMAX",

 "url":"http://img.fun-guide.mobi/show?src=http://zhaohang.fun-guide.mobi:8080/tm/images/hb/4779-20121225133147.jpg&w=140",

 "popularity":"6"

 },

 {

 ...

 }

 ]

 }

 

现在,想把它映射到自定义的对象中去。有几种情况:

 

第一种情况,简单地把state数组里面的第一个元素映射成一个FGStateModel类

那么就是,取出这个节点:

    NSDictionary *stateObject = [[self.json objectForKey:@"state"] objectAtIndex:0];

然后,执行映射:

    self.state = [FGStateModel objectFromJSONObject:stateObject mapping:nil];

 

第二种情况,把movie这个字典数组映射成一个数组,数组的每个元素是FGMovieModel

    NSArray *movieObject = [self.json objectForKey:@"movie"];

    self.movieList = [FGMovieModel objectFromJSONObject:movieObject mapping:nil];

 

第三种情况,如果对象的属性和JSON名字不一样,可以使用映射表,例如我们想把上面整个json对象映射成一个 FGResponseModel 对象,其中,state数组映射成 responseState 属性,movie 数组映射成 movieList 属性。那么,我们需要告诉映射器这个数组里的元素要映射成什么对象。

 

所以,通过 mapping 这个参数告诉它:“请把 JSON 里的 state 数组里的每个元素映射成一个 FGStateModel 对象,并且把最终的数组放到responseState这个属性里。另外,把 movie 这个数组映射成一个 FGMovieModel 数组,并且保存到 movieList 这个属性中。“

 

    NSDictionary *mapping = [NSDictionary dictionaryWithObjectsAndKeys:

                             [FGStateModel mappingWithKey:@"responseState" mapping:nil], @"state",

                             [FGMovieModel mappingWithKey:@"movieList" mapping:nil], @"movie",

                             nil];

    self.response = [FGResponseModel objectFromJSONObject:self.json mapping:mapping];

以上是关于关于iOS上的对象映射公用方法-备的主要内容,如果未能解决你的问题,请参考以下文章

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

公用属性与原型链

导航上的片段生命周期重叠

项目代码规范

java 关于锁常见面试题

在 MAMP 上使用虚拟主机映射 Laravel 公用文件夹时遇到问题