JSONModel 是一個庫,它能智能并且快速的創建出數據 model,你可以在你的 iOS 項目或者 OSX 項目上使用它。
使用前準備
添加 JSONModel 到你的工程中
1、需要的環境:
- ARC,iOS 5.0+ / OSX 10.7 +
- 引入框架SystemConfiguration.framework
2、獲取途徑:
1)、通過源文件獲取* 下載 JSONModel zip包* 將 JSONModel 文件夾拷貝到你的工程項目中* 將庫 SystemConfiguration.framework 添加上 2)、使用 Cocoa pods 來安裝:pod 'JSONModel'
3、源碼的文檔:
源碼本身包含了類的文檔,你可以自己編譯后導入到你的Xcode中:
- 如果你還沒安裝 appledoc ,先安裝 appledoc
- 在Xcode上鍵入 appledoc 安裝文檔,在根目錄下
- 重啟Xcode
基本使用
假設你的 JSON 串像下面這樣子:
{"id":"10", "country":"Germany", "dialCode": 49, "isInEurope":true}
- 創建一個你自己的類,并繼承至 JSONModel
- 在你的頭文件里面進行聲明你所需要的 JSON key值
#import "JSONModel.h"@interface CountryModel : JSONModel@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* country;
@property (strong, nonatomic) NSString* dialCode;
@property (assign, nonatomic) BOOL isInEurope;@end
.m文件中你不需要做其他的事情了.
初始化你的 model ,如下所示:
#import "CountryModel.h"
...NSString* json = (fetch here JSON from Internet) ...
NSError* err = nil;
CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];
如果傳過來的 JSON 合法,你所定義的所有的屬性都會與該 JSON 值相匹配,并且 JSONModel 也會嘗試盡可能的轉換成你所想要的數據,就像上面的例子:
- 轉化 "id",從字符串轉換成 int 型
- 拷貝 country 屬性的值
- 轉換 dialCode ,從NSNumber 轉換為 NSString 值
- 最后一個呢是將 isInEurope 轉換成 BOOL 的屬性
所以,你需要做的就是定義出你期望的屬性就行了。
例子
命名自動匹配
{"id": "123","name": "Product name","price": 12.95
}
@interface ProductModel : JSONModel@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;@end@implementation ProductModel@end
model中含有其他的model
{"order_id": 104,"total_price": 13.45,"product" : {"id": "123","name": "Product name","price": 12.95}
}
@interface OrderModel : JSONModel@property (assign, nonatomic) int order_id;
@property (assign, nonatomic) float total_price;
@property (strong, nonatomic) ProductModel* product;@end@implementation OrderModel@end
model中含有其他model的集合
{"order_id": 104,"total_price": 103.45,"products" : [{"id": "123","name": "Product #1","price": 12.95},{"id": "137","name": "Product #2","price": 82.95}]
}
@protocol ProductModel@end@interface ProductModel : JSONModel@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;@end@implementation ProductModel@end@interface OrderModel : JSONModel@property (assign, nonatomic) int order_id;
@property (assign, nonatomic) float total_price;
@property (strong, nonatomic) NSArray<ProductModel>* products;@end@implementation OrderModel@end
鍵值轉回匹配
{"order_id": 104,"order_details" : [{"name": "Product#1","price": {"usd": 12.95}}]
}
@interface OrderModel : JSONModel@property (assign, nonatomic) int id;
@property (assign, nonatomic) float price;
@property (strong, nonatomic) NSString* productName;@end@implementation OrderModel+ (JSONKeyMapper*)keyMapper
{return [[JSONKeyMapper alloc] initWithDictionary:@{@"order_id": @"id",@"order_details.name": @"productName",@"order_details.price.usd": @"price"}];
}@end
設置全局的鍵值轉回匹配
[JSONModel setGlobalKeyMapper:[[JSONKeyMapper alloc] initWithDictionary:@{@"item_id":@"ID",@"item.name": @"itemName"}]
];
將下滑線轉換成首字母大寫
{"order_id": 104,"order_product" : @"Product#1","order_price" : 12.95
}
@interface OrderModel : JSONModel@property (assign, nonatomic) int orderId;
@property (assign, nonatomic) float orderPrice;
@property (strong, nonatomic) NSString* orderProduct;@end@implementation OrderModel+ (JSONKeyMapper*)keyMapper
{return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}@end
可以為空的屬性值
{"id": "123","name": null,"price": 12.95
}
@interface ProductModel : JSONModel@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString<Optional>* name;
@property (assign, nonatomic) float price;
@property (strong, nonatomic) NSNumber<Optional>* uuid;@end@implementation ProductModel@end
忽略某些屬性
{"id": "123","name": null
}
@interface ProductModel : JSONModel@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString<Ignore>* customProperty;@end@implementation ProductModel@end
讓所有的屬性都可以有空的屬性值
@implementation ProductModel+ (BOOL)propertyIsOptional:(NSString*)propertyName
{return YES;
}@end
將集合元素轉換成 model
{"order_id": 104,"total_price": 103.45,"products" : [{"id": "123","name": "Product #1","price": 12.95},{"id": "137","name": "Product #2","price": 82.95}]
}
@protocol ProductModel@end@interface ProductModel : JSONModel@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;@end@implementation ProductModel@end@interface OrderModel : JSONModel@property (assign, nonatomic) int order_id;
@property (assign, nonatomic) float total_price;
@property (strong, nonatomic) NSArray<ProductModel, ConvertOnDemand>* products;@end@implementation OrderModel@end