无线客户端框架设计(5.1):将JSON映射为实体对象(iOS)

移动开发 iOS
我所设计的客户端框架,三个平台之间互相取长补短,保持统一的思想,而其中最重要的一环就是,面向对象的编程方式。本文为大家介绍iOS如何将JSON映射为实体对象。

iOS开发人员已经习惯于将JSON转换为字典或者数组来进行操作了,接下来我要做的事情,可能匪夷所思,但是,对WP和Android开发人员而言,他们更倾向于将JSON转换为实体对象进行操作。

我所设计的客户端框架,三个平台之间互相取长补短,保持统一的思想,而其中最重要的一环就是,面向对象的编程方式。

书接上文,我在异步调用完MobileAPI并成功获取到JSON后,仅仅将其转换为jsonValue,如下所示:

201309052152.jpg

后续要做的事情,就是把jsonValue转换为实体对象了。

首先,要说一下JSON的格式。

MobileAPI返回的JSON字符串有几种格式:

1)单一实体:

a)简单属性:

  1.     "userName""baobao"
  2.     "userAge": 18 

b)属性中有复合属性,且该复合属性是另一个自定义实体:

  1.      "UserId": 1, 
  2.      "UserInfo": { 
  3.               "userName""baobao"
  4.        "userAge": 18 

c)属性中有复合属性,且该复合属性是一个数组:

  1.      "Career""IT"
  2.      "Users": [ 
  3.         { 
  4.              "userName""Bill.Gates"
  5.              "userAge": 60 
  6.         }, 
  7.         { 
  8.              "userName""baobao"
  9.              "userAge": 18 
  10.         } 
  11.     ] 

2)数组

a)规范的写法:

  1.     "Users": [ 
  2.         { 
  3.             "userName""Bill.Gates"
  4.             "userAge": 60 
  5.         }
  6.         { 
  7.             "userName""baobao"
  8.             "userAge": 18 
  9.         } 
  10.     ] 
  11. }     

b)不规范的写法:

  1.     { 
  2.         "userName""Bill.Gates"
  3.         "userAge": 60 
  4.     }, 
  5.     { 
  6.         "userName""baobao"
  7.         "userAge": 18 
  8.     } 

对以上格式进行归纳,我们发现,只需要指定好:

1)整个JSON字符串是规范的(这时是一个字典),还是不规范的(这时是一个数组)

2)对于规范的JSON字符串,每个JSON字段映射为实体的哪个字段,就是说,from是什么,to是什么?

3)实体字段的数据类型。对于JSON而言,简单类型,只有NSString和NSNumber两种(日期按字符串对待,布尔值按整数0和1对待)。复合类型,有2种:要么是一个自定义实体(这时是一个字典),要么是一个数组。

基于此,我们创建统一格式的实体格式如下:

//以下为UserEntity.h文件:

  1. #import <Foundation/Foundation.h> 
  2. @class ObjectMapping; 
  3. @interface UserEntity : NSObject 
  4. NSString *name; 
  5. NSNumber *age; 
  6.  
  7. @property (nonatomic,retain) NSString *name; 
  8. @property (nonatomic,retain) NSNumber *age; 
  9. - (ObjectMapping *)objectMapping; 
  10.  
  11. @end 
  12. //以下为UserEntity.m文件: 
  13. #import "UserEntity.h" 
  14. #import "ObjectMapping.h" 
  15. @implementation UserEntity 
  16. @synthesize name; 
  17. @synthesize age; 
  18.  
  19. - (ObjectMapping *)objectMapping { 
  20. ObjectMapping *mapping = [ObjectMapping mappingForClass:[UserEntity class]]; 
  21. [mapping converEntityFromJsonToEntity:@"userName" to:@"name" withClass: @"NSString"]; 
  22. [mapping converEntityFromJsonToEntity:@"userAge" to:@"age" withClass: @"NSNumber"]; 
  23. return mapping; 
  24.  
  25. - (void)dealloc { 
  26. [name release]; 
  27. [age release]; 
  28. [super dealloc]; 
  29. @end 

在格式统一的情况下,我们来讨论在MyApp中是如何使用的,参见APageViewController.m文件,我们继续改造上一节没有完成的requestFinished方法:

201309101117.jpg

通过ObjectMappingLoader的loadObjectWithClassName方法,我们将jsonValue转换为实体 result,然后再一次将result强制转换为WeatherWrapEntity类型的实体。接下来我们就可以使用 weatherWrapEntity实体中的任何属性了,都是JSON里面返回的数据。

使用起来非常简单,但这一切都是MyLib类库下ObjectMapping目录中的3个类来实现的:

201309101122.jpg

原理比较简单,使用到了迭代算法,把JSON格式的字符串先转换为字典,然后再迭代之,转换为实体。

本节源码如下: YoungHeart-Chapter-05-1.zip

另外,对各种情况的模拟,参见MyApp下的MyAppTest目录,这是一个单元测试,相应的Target为MyAppTests,每次修改 MyLib的时候不是要把libMyLib.a重新引入到MyApp项目的MyApp这个Target中嘛,请同时将其也引入到MyAppTests这个 Target中。

责任编辑:闫佳明 来源: cnblogs
相关推荐

2013-09-03 09:35:48

无线客户端框架设计iOS

2013-09-03 09:55:42

iOS无线客户端框架设计

2013-09-09 10:48:24

iOS无线客户端框架设计

2013-09-09 10:36:14

iOS无线客户端框架设计

2013-09-03 09:10:56

2012-11-28 11:05:42

IBMdW

2009-09-16 16:09:41

NIS服务器客户端NIS

2009-06-12 19:18:08

REST客户端框架JavaScript

2013-07-22 14:29:35

iOS开发ASIHTTPRequ

2011-03-07 13:50:20

2009-11-05 13:08:44

WCF客户端配置

2010-03-19 12:14:13

无线AP Client

2010-01-05 14:32:01

JSON 数据

2021-09-22 15:46:29

虚拟桌面瘦客户端胖客户端

2011-08-17 10:10:59

2023-03-31 13:31:45

2024-11-21 16:37:30

客户端业务解耦框架

2010-03-16 17:53:43

无线客户端NIC

2013-06-24 17:14:00

安卓

2012-06-25 12:43:26

.NET框架
点赞
收藏

51CTO技术栈公众号