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中。

无线客户端框架设计(5.1):将JSON映射为实体对象(iOS篇)的更多相关文章

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

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

  2. 无线客户端框架设计(3):基类的设计(iOS篇)

    本文代码:YoungHeart-Chapter-03.zip 没有基类的App都不是好App. 因为iOS使用的是mvc模式的开发模式,所以,业务逻辑基本都在每个页面相应的ViewController ...

  3. 无线客户端框架设计(2):项目结构的设计(iOS篇)

    本文附带源码:YoungHeart-Chapter-02.zip 在设计任何一个框架之前,都应规划好项目结构. 假定Git作为我们的项目管理工具.我们要建立两个仓库,一个用于存放我们的框架,另一个用于 ...

  4. 无线客户端框架设计(5):调用MobileAPI的设计(iOS篇)

    这一节讲如何发起网络请求. iOS用于调用MobileAPI的第三方组件很多,我们这里采用的是以下组件: 1)ASIHTTPRequest,用于请求MobileAPI:http://allseeing ...

  5. 无线客户端框架设计(4):自定义生命周期的设计(iOS篇)

    首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻辑彻底隔离.于是我们可以把xib的 ...

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

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

  7. JSON字符串转实体对象

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

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

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

  9. 根据json生成java实体类

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

随机推荐

  1. VC++ 动态生成 成组的 RadioButton 按钮组

    先说一下 静态创建的方法: 单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别.假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态.我们 ...

  2. delete drop truncate 区别

    truncate 删除内容,并释放空间,并不删除表结构,删除标识列,标识列重新从1开始delete 删除内容,不释放空间,不删除表结构,不删除标识列,标识列继续增加drop 直接删除表

  3. R--相关分布函数、统计函数的使用

    分布函数家族: *func()r : 随机分布函数d : 概率密度函数p : 累积分布函数q : 分位数函数 func()表示具体的名称如下表: 例子 #r : 随机分布函数 #d : 概率密度函数 ...

  4. andorid SQLite数据库的增删改查 和事务操作

    .xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  5. python 写文件,utf-8问题

    写文件报数据. 同样的编码. 含中文字段的输出文件 编码为utf-8 无中文的却是asc import codecstxt = u”qwer”file=codecs.open(“test”,”w”,” ...

  6. nginx配置文件nginx.conf超详细讲解

    #nginx进程,一般设置为和cpu核数一样worker_processes 4;                        #错误日志存放目录 error_log  /data1/logs/er ...

  7. Android -- The Manifest File

    Before the Android system can start an app component, the system must know that the component exists ...

  8. 【Java】XML解析之DOM

    DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...

  9. [vb.net]简单多线程实例

    .Imports System .Imports System.Threading . . .Module Module1 . . Sub Main() . . Dim mythread1 As Th ...

  10. 一个使用方便的对FMDB进行封装的框架和一个可以切应用图标的应用

    框架的git地址 :https://github.com/Joker-King/JKDBModel 切割图标的应用地址 http://pan.baidu.com/s/1kVjflwr