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中。
文章列表