将JSON映射为实体对象(iOS篇)

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

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

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

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

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

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

1)单一实体:

a)简单属性:

{

"userName": "baobao",

"userAge": 18

}

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

{

"UserId": 1,

"UserInfo": {

"userName": "baobao",

"userAge": 18

}

}

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

{

"Career": "IT",

"Users": [

{

"userName": "Bill.Gates",

"userAge": 60

},

{

"userName": "baobao",

"userAge": 18

}

]

}

2)数组

a)规范的写法:

{

"Users": [

{

"userName": "Bill.Gates",

"userAge": 60

},

{

"userName": "baobao",

"userAge": 18

}

]

}

b)不规范的写法:

[

{

"userName": "Bill.Gates",

"userAge": 60

},

{

"userName": "baobao",

"userAge": 18

}

]

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

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

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

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

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

//以下为UserEntity.h文件:

#import <Foundation/Foundation.h>

@class ObjectMapping;

@interface UserEntity : NSObject

{

NSString *name;

NSNumber *age;

}

@property (nonatomic,retain) NSString *name;

@property (nonatomic,retain) NSNumber *age;

- (ObjectMapping *)objectMapping;

@end

//以下为UserEntity.m文件:

#import "UserEntity.h"

#import "ObjectMapping.h"

@implementation UserEntity

@synthesize name;

@synthesize age;

- (ObjectMapping *)objectMapping {

ObjectMapping *mapping = [ObjectMapping mappingForClass:[UserEntity class]];

[mapping converEntityFromJsonToEntity:@"userName" to:@"name" withClass: @"NSString"];

[mapping converEntityFromJsonToEntity:@"userAge" to:@"age" withClass: @"NSNumber"];

return mapping;

}

- (void)dealloc {

[name release];

[age release];

[super dealloc];

}

@end

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

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

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

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

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

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

 
 
分类: App开发

将JSON映射为实体对象(iOS篇)的更多相关文章

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

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

  2. [Swift通天遁地]四、网络和线程-(11)将服务器返回的JSON映射为实例对象

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. 一行code实现ADO.NET查询结果映射至实体对象。

    AutoMapper是一个.NET的对象映射工具. 主要用途 领域对象与DTO之间的转换.数据库查询结果映射至实体对象. 这次我们说说 数据库查询结果映射至实体对象. 先贴一段代码: public S ...

  4. JSON字符串转实体对象

    JSON转实体两种方式 代码片段 ; i < dt.Rows.Count; i++) { //Json字符串 string designJson = dt.Rows[i]["Desig ...

  5. Activiti 5.17 实体对象与类和数据库表的映射

    一.Activiti 5.17 mybatis的mapping文件声明映射的实体对象关系. <configuration><settings><settingname=& ...

  6. EBS OAF开发中实体对象和视图对象的属性设置器

    EBS OAF开发中实体对象和视图对象的属性设置器 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle ...

  7. 根据json生成java实体类

    之前一篇讲过了XML转java实体对象,使用的是JAXB技术,今天给大家推荐一个在线转json到java实体对象: http://www.bejson.com/json2javapojo/new/ 转 ...

  8. 浅谈使用RestKit将服务器的Json直接映射为本地对象

    RestKit是一个主要用于iOS上网络通信的开源框架,除了发送请求与接受响应这些基本功能外,还附带coredata,以及将远程JSON映射为本地对象的功能.目前版本0.9.3,coredata还不是 ...

  9. C# 将object对象转换为实体对象

    C# 将object对象转换为实体对象.一共两种方法. 第一种方法,代码如下: /// <summary> /// 将object对象转换为实体对象 /// </summary> ...

随机推荐

  1. Hadoop之环境搭建

    初学Hadoop之环境搭建   阅读目录 1.安装CentOS7 2.安装JDK1.7.0 3.安装Hadoop2.6.0 4.SSH无密码登陆 本文仅作为学习笔记,供大家初学Hadoop时学习参考. ...

  2. POJ 3233 Matrix Power Series(矩阵高速功率+二分法)

    职务地址:POJ 3233 题目大意:给定矩阵A,求A + A^2 + A^3 + - + A^k的结果(两个矩阵相加就是相应位置分别相加).输出的数据mod m. k<=10^9.     这 ...

  3. 几款web版整合(QQ、msn、icq、yahoo通、Gtalk等)即时聊天http://hi.baidu.com/ejie/blog/item/e89794ef9a9431efce1b3ebd.html

        直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,很方便.在此将时汇总,便于大家查找,节约大家一点时间. 此都是官 ...

  4. Win7搭建NodeJs开发环境

    Win7搭建NodeJs开发环境以及HelloWorld展示—图解 Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第 ...

  5. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

  6. 前端构建利器Grunt—Bower

    runt + Bower—前端构建利器 目前比较流行的WEB开发的趋势是前后端分离.前端采用重量级的Javascript框架,比如Angular,Ember等,后端采用restful API的Web ...

  7. JS判断字符串是否全为中文

    //第一种代码(全为中文则返回"true",不全为中文则返回"false"): <script language="javascript&quo ...

  8. HDU 1256 图片8

    图片8 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  9. 通过 C# 代码操作 Google 日历

    原文:通过 C# 代码操作 Google 日历 本文主题 借助 Google .NET APIs Client Library,通过 C# 代码在 Google 日历中创建会议邀请. 本文背景 最近, ...

  10. OpenSUSE 13.2使用VPN(PPTP)

    新年开始,有时查询个资料或是下个软件包并不是那么愉快,决定使用付费VPN,他们使用的是用户名及密码的验证方式 在网上找到了一个教程,挺详尽的,如果想按照步骤能使用即可的原则,跟着我一起设置,想了解更多 ...