将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. typecheck()简析

    #define typecheck(type,x) \ ({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__d ...

  2. 安装后维修指南再次双系统xp、win7、ubuntu

    在本文中,主机为单个硬盘,三个步骤. 第一步: 使用liveCD要么u盘引导计算机进入ubuntu.这里最好是确保两个系统版本号之间的一致性. 菜单 System -> Administrati ...

  3. windows 开机自动登录,或者说是开机后自动进入桌面

    这篇文章,对于XP以及XP以上版本有效,包括Windows Server服务器操作系统. 1.原理 --Windows自动登录的原理是,开始后,自动输入登录所使用的账号的用户名和密码,并且自动进入桌面 ...

  4. 2.4 LINQ中使用where子句指定筛选条件

    本篇讲解的内容有: 使用where筛选过滤LINQ查询 带逻辑的where筛选 多个where筛选子句 [1.使用where筛选过滤LINQ查询] 通常一个LINQ查询不会如前面的示例代码这么简单,经 ...

  5. Spring IOC 之ApplicationContext的其他功能

    正如上面章节所介绍的那样, org.springframework.beans.factory 包提供了管理和操作beans的 基本功能. org.springframework.context包增加 ...

  6. leetcode 第43题 Wildcard Matching

    题目:(这题好难.题目意思类似于第十题,只是这里的*就是可以匹配任意长度串,也就是第十题的‘.*’)'?' Matches any single character. '*' Matches any ...

  7. leetcode第32题--Search in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  8. leetcode第十题--Regular Expression Matching

    Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...

  9. 基于C# 语言的两个html解析器

    基于C# 语言的两个html解析器 1)Html Agility Pack http://nsoup.codeplex.com/ 代码段示例: HtmlDocument doc = new HtmlD ...

  10. javascript面向对象2

    原文:javascript面向对象2 首先我们先创建一个对象 var user = Object(); user.name = "张三"; user.age = 20; user. ...