Magical Data Modelling Framework for JSON
https://github.com/icanzilb/JSONModel
New: In version 0.12.0 I added experimental support for exportingJSON modelstoCoreData.
最新消息:在0.12.0版本中,我試驗性的支持將 JSON models 轉(zhuǎn)化成 CoreData .
Give it a try and let me know, post an issue or just get in touch. Try something like that:
如果你試驗過了丘跌,有空告知哥一下秧廉,哥寫開源庫也不容易,發(fā)一篇博文或者給個鏈接以表支持:
NSError*error=nil;GitHubRepoEntity*entity=[GitHubRepoEntityentityWithModel:modelinContext:self.managedObjectContexterror:&error];[self.managedObjectContextsave:nil];
If you like JSONModel and use it can you please: 1) star this repo 2)send me some feedback. Thanks!
JSONModel is a library, which allows rapid creation of smart data models. You can use it in your iOS or OSX apps.
JSONModel automatically introspects your model classes and the structure of your JSON input and reduces drastically the amount of code you have to write.
如果你喜歡 JSONModel ,那么你可以:1)長期關(guān)注這個開源項目,2)你是土豪的話,給哥捐點吧,謝謝.
JSONModel 是一個庫,他能智能并且快速的創(chuàng)建出數(shù)據(jù) model,你可以在你的 iOS 項目或者 OSX 項目上使用它.
Adding JSONModel to your project
添加 JSONModel 到你的工程中
需要的環(huán)境:
ARC only; iOS 5.0+ / OSX 10.7+
SystemConfiguration.framework
ARC,iOS 5.0+ / OSX 10.7 +
引入框架SystemConfiguration.framework
Download the JSONModel repository as azip fileor clone it
Copy the JSONModel sub-folder into your Xcode project
Link your app to SystemConfiguration.framework
1. ?下載?JSONModel zip包
2. ?將?JSONModel?文件夾拷貝到你的工程項目中
3. ?將庫?SystemConfiguration.framework 添加上
In your project'sPodfileadd the JSONModel pod:
使用 Cocoa pods 來安裝:
pod'JSONModel'
If you want to read more about CocoaPods, have a look atthis short tutorial.
如果你不會用 CocoaPods雅采,你可以看看這簡單的教程蛛碌。
源碼的文檔
The source code includes class docs, which you can build yourself and import into Xcode:
源碼本身包含了類的文檔打颤,你可以自己編譯后導(dǎo)入到你的Xcode中:
If you don't already haveappledocinstalled, install it withhomebrewby typingbrew install appledoc.
Install the documentation into Xcode by typingappledoc .in the root directory of the repository.
Restart Xcode if it's already running.
1. ?如果你還沒安裝 appledoc ,先安裝 appledoc
2. ?在Xcode上鍵入 appledoc 安裝文檔苦掘,在根目錄下
3. ?重啟Xcode
基本使用
Consider you have a JSON like this:
假設(shè)你的 JSON 串像下面這樣子:
{"id":"10","country":"Germany","dialCode":49,"isInEurope":true}
Create a new Objective-C class for your data model and make it inherit the JSONModel class.
Declare properties in your header file with the name of the JSON keys:
創(chuàng)建一個你自己的類,并繼承至 JSONModel
在你的頭文件里面進(jìn)行聲明你所需要的 JSON key值
#import "JSONModel.h"@interfaceCountryModel:JSONModel@property(assign,nonatomic)intid;@property(strong,nonatomic)NSString*country;@property(strong,nonatomic)NSString*dialCode;@property(assign,nonatomic)BOOLisInEurope;@end
There's no need to do anything in the.mfile.
.m文件中你不需要做其他的事情了.
Initialize your model with data:
初始化你的 model ,如下所示:
#import "CountryModel.h"...NSString*json=(fetchhereJSONfromInternet)...NSError*err=nil;CountryModel*country=[[CountryModelalloc]initWithString:jsonerror:&err];
If the validation of the JSON passes you have all the corresponding properties in your model populated from the JSON. JSONModel will also try to convert as much data to the types you expect, in the example above it will:
如果傳過來的 JSON 合法,你所定義的所有的屬性都會與該 JSON 值相匹配,并且 JSONModel 也會嘗試盡可能的轉(zhuǎn)換成你所想要的數(shù)據(jù),就像上面的例子:
convert "id" from string (in the JSON) to an int for your class
just copy country's value
convert dialCode from number (in the JSON) to an NSString value
finally convert isInEurope to a BOOL for your BOOL property
轉(zhuǎn)化 "id",從字符串轉(zhuǎn)換成 int 型
拷貝 country 屬性的值
轉(zhuǎn)換 dialCode ,從NSNumber 轉(zhuǎn)換為 NSString 值
最后一個呢是將 isInEurope 轉(zhuǎn)換成 BOOL 的屬性
And the good news is all you had to do is define the properties and their expected types.
所以,你需要做的就是定義出你期望的屬性就行了驮瞧。
在線教程
Official website:http://www.jsonmodel.com
Class docs online:http://jsonmodel.com/docs/
Step-by-step tutorials:
傻瓜教程:
How to fetch and parse JSON by using data models
Performance optimisation for working with JSON feeds via JSONModel
How to make a YouTube app using MGBox and JSONModel
例子
命名自動匹配
{? "id": "123",? "name": "Product name",? "price": 12.95}
@interface ProductModel : JSONModel@property (assign, nonatomic) intid;@property (strong, nonatomic) NSString*name;@property (assign, nonatomic) floatprice;@end@implementation ProductModel@end
Model cascading (models including other models)
model中含有其他的model
{? "order_id": 104,? "total_price": 13.45,? "product" : {? ? "id": "123",? ? "name": "Product name",? ? "price": 12.95? }}
@interface OrderModel : JSONModel@property (assign, nonatomic) intorder_id;@property (assign, nonatomic) floattotal_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) intid;@property (strong, nonatomic) NSString*name;@property (assign, nonatomic) floatprice;@end@implementation ProductModel@end@interface OrderModel : JSONModel@property (assign, nonatomic) intorder_id;@property (assign, nonatomic) floattotal_price;@property (strong, nonatomic)NSArray*products;@end@implementation OrderModel@end
鍵值轉(zhuǎn)回匹配
{? "order_id": 104,? "order_details" : [? ? {? ? ? "name": "Product#1",? ? ? "price": {? ? ? ? "usd": 12.95? ? ? }? ? }? ]}
@interface OrderModel : JSONModel@property (assign, nonatomic) intid;@property (assign, nonatomic) floatprice;@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
Global key mapping (applies to all models in your app)
設(shè)置全局的鍵值轉(zhuǎn)回匹配
[JSONModel setGlobalKeyMapper:[[JSONKeyMapper alloc] initWithDictionary:@{? ? ? @"item_id":@"ID",? ? ? @"item.name": @"itemName"? }]];
Map automatically under_score case to camelCase
將下滑線轉(zhuǎn)換成首字母大寫
{? "order_id": 104,? "order_product" : @"Product#1",? "order_price" : 12.95}
@interface OrderModel : JSONModel@property (assign, nonatomic) intorderId;@property (assign, nonatomic) floatorderPrice;@property (strong, nonatomic) NSString*orderProduct;@end@implementation OrderModel+(JSONKeyMapper*)keyMapper{? return[JSONKeyMappermapperFromUnderscoreCaseToCamelCase];}@end
Optional properties (i.e. can be missing or null)
可以為空的屬性值
{
"id": "123",
"name": null,
"price": 12.95
}@interface ProductModel : JSONModel@property (assign, nonatomic) int id;@property (strong, nonatomic) NSString*name;@property (assign, nonatomic) float price;@property (strong, nonatomic) NSNumber*uuid;@end@implementation ProductModel@end
Ignored properties (i.e. JSONModel completely ignores them)
忽略某些屬性
{
"id": "123",
"name": null
}@interface ProductModel : JSONModel@property (assign, nonatomic) int id;@property (strong, nonatomic) NSString*customProperty;@end@implementation ProductModel@end
Make all model properties optional (avoid if possible)
讓所有的屬性都可以有空的屬性值
@implementation ProductModel+(BOOL)propertyIsOptional:(NSString*)propertyName
{
return YES;
}@end
Lazy convert collection items from dictionaries to models
將集合元素轉(zhuǎn)換成 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) intid;@property (strong, nonatomic) NSString*name;@property (assign, nonatomic) floatprice;@end@implementation ProductModel@end@interface OrderModel : JSONModel@property (assign, nonatomic) int order_id;@property (assign, nonatomic) float total_price;@property (strong, nonatomic) NSArrayConvertOnDemand>* products;@end@implementation OrderModel@end
Using the built-in thin HTTP client
使用內(nèi)置的 HTTP 鏈接
//addextraheaders[[JSONHTTPClientrequestHeaders]setValue:@"MySecret"forKey:@"AuthorizationToken"];//makepost,getrequests[JSONHTTPClientpostJSONFromURLWithString:@"http://mydomain.com/api"params:@{@"postParam1":@"value1"}completion:^(idjson,JSONModelError*err){//checkerr,processjson...}];
Export model to NSDictionary or to JSON text
將 model 導(dǎo)出為字典或者json字符串
ProductModel*pm=[[ProductModelalloc]initWithString:jsonStringerror:nil];pm.name=@"Changed Name";//converttodictionaryNSDictionary*dict=[pmtoDictionary];//converttotextNSString*string=[pmtoJSONString];
json validation
data transformations
error handling
custom data validation
automatic compare and equality features
and more.
json數(shù)據(jù)鍵值匹配
數(shù)據(jù)轉(zhuǎn)換
好的容錯能力
自定義數(shù)據(jù)鍵值匹配
自動比較以及判斷的特性
還有更多的等待親來挖掘
以下是本人使用的測試結(jié)果