現(xiàn)在的iOS在跟服務(wù)器進行交互式孵户,采取的常用數(shù)據(jù)格式是XML和JSON,而今天就探討一個JSON解析框架 —— MJExtension憾股。
MJExtension是李明杰老師寫的一個開源框架鹿蜀,是一個轉(zhuǎn)換速度快箕慧,使用簡單方便的字典轉(zhuǎn)模型框架。
它可以完成的數(shù)據(jù)轉(zhuǎn)換是有如下方式的:
-
JSON
-->Model
茴恰、Core Data Model
-
JSONString
-->Model
颠焦、Core Data Model
-
Model
、Core Data Model
-->JSON
-
JSON Array
-->Model Array
琐簇、Core Data Model Array
-
JSONString
-->Model Array
蒸健、Core Data Model Array
-
Model Array
、Core Data Model Array
-->JSON Array
在MJExtension的GitHub上婉商,文檔中已經(jīng)很清楚的寫明了這個框架的簡單用法似忧,所以我就不贅述這個框架最基本的使用了。今天我打算舉一個很簡單的例子丈秩,來告訴大家盯捌,實際項目中該如何使用MJExtension框架來處理Model數(shù)據(jù)。
首先我們先來看一個JSON數(shù)據(jù)格式蘑秽。
{
"group": [
{
"roomgroup": [
{
"device_name": "海爾",
"address": "客廳電視機",
"device_id": "c6f7cd61-245f-46fc-8e81-1e32a0f38cd6",
"device_status": "0"
},
{
"device_name": "樂視",
"address": "餐廳電視機",
"device_id": "7c756f4a-d3cf-492a-817b-92311f6ea34b",
"device_status": "0"
}
],
"room": "廚房"
},
{
"roomgroup": [
{
"device_name": "海爾",
"address": "客廳電視機",
"device_id": "784ec8cd-723d-44bc-a6cc-3ae78022e6e9",
"device_status": "0"
}
],
"room": "客廳"
},
{
"roomgroup": [
{
"device_name": "樂視",
"address": "餐廳電視機",
"device_id": "3d141e71-95ce-4e04-845a-9f0a455d37c2",
"device_status": "0"
}
],
"room": "陽臺"
}
],
"message": {
"code": "200",
"message": "操作成功饺著!"
},
"rows": null,
"total": 0
}
觀察這個JSON數(shù)據(jù),我們能發(fā)現(xiàn)它里面裝著數(shù)組屬性肠牲,而數(shù)組中又裝著其他模型幼衰。這里主要就是要提取group
這個數(shù)組中的數(shù)據(jù)。
- 那么首先我們定義一個模型缀雳,我把它命名為
GroupRoomModel
渡嚣。
@property (nonatomic, copy) NSMutableArray *roomGroup;
@property (nonatomic, copy) NSMutableArray *group;
@property (nonatomic, copy) NSString *room;
@property (nonatomic, copy) NSMutableArray *deviceDetail;
- 接著再定義一個模型,我把它命名為
RoomModel
,用來存儲roomgroup
中的數(shù)據(jù)
@property (nonatomic, copy) NSString *deviceName;
@property (nonatomic, copy) NSString *deviceStatus;
@property (nonatomic, copy) NSString *deviceID;
@property (nonatomic, copy) NSString *address;
- 接下來我們要重新映射
Model
中的鍵值與JSON
數(shù)據(jù)中的對應(yīng)肥印。
[GroupRoomModel mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{
@"roomGroup":@"roomgroup",
};
}];
[RoomModel mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
return @{
@"deviceID":@"device_id",
@"deviceName":@"device_name",
@"deviceStatus":@"device_status",
};
}];
- 之后先解析我們拿到的
data
识椰,這里可以直接解析出group
GroupRoomModel *groupRoomModel = [GroupRoomModel mj_objectWithKeyValues:data];
一行代碼搞定,是不是很簡單深碱。
之后我們解析group
這個數(shù)組中的數(shù)據(jù)腹鹉,把room
中的字符串提取出來存在Model
的room
里,把roomgroup
里的字典分別提取出來敷硅,存在RoomModel
類型的Model里功咒,并且把RoomModel
添加到GroupRoomModel
中的deviceDetail
這個可變數(shù)組中。
具體的代碼如下
NSMutableArray *modelArray = [NSMutableArray array];
_dataSource = [NSMutableArray array];
for (NSDictionary *dic in groupRoomModel.group) {
GroupRoomModel *model = [GroupRoomModel mj_objectWithKeyValues:dic];
NSMutableArray *deviceArray = [NSMutableArray array];
for (NSDictionary *deviceDic in model.roomGroup) {
RoomModel *roomModel = [RoomModel mj_objectWithKeyValues:deviceDic];
[deviceArray addObject:roomModel];
}
[modelArray addObject:model];
model.deviceDetail = [NSMutableArray arrayWithArray:deviceArray];
[_dataSource addObject:model];
}
這樣我們就完成了多層的JSON數(shù)據(jù)解析竞膳。
其實MJExtension的使用非常簡單航瞭,多看看文檔,很容易掌握坦辟。