微前端架构如何改变企业的开发模式与效率提升
796
2022-11-04
jsON的神奇数据建模框架 - 允许快速创建智能数据模型
JSONModel - Magical Data Modeling Framework for JSON
JSONModel allows rapid creation of smart data models. You can use it in your iOS, macOS, watchOS and tvOS apps. Automatic introspection of your model classes and JSON input drastically reduces the amount of code you have to write.
See CHANGELOG.md for details on changes.
Installation
CocoaPods
pod 'JSONModel'
Carthage
github "jsonmodel/jsonmodel"
Manual
download the JSONModel repositorycopy the JSONModel sub-folder into your Xcode projectlink your app to SystemConfiguration.framework
Basic Usage
Consider you have JSON like this:
{ "id": 10, "country": "Germany", "dialCode": 49, "isInEurope": true }
create a JSONModel subclass for your data modeldeclare properties in your header file with the name of the JSON keys:
@interface CountryModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *country;@property (nonatomic) NSString *dialCode;@property (nonatomic) BOOL isInEurope;@end
There's no need to do anything in the implementation (.m) file.
initialize your model with data:
NSError *error;CountryModel *country = [[CountryModel alloc] initWithString:myJson error:&error];
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:
convert id from string (in the JSON) to an int for your classcopy the country valueconvert dialCode from a number (in the JSON) to an NSString valuecopy the isInEurope value
All you have to do is define the properties and their expected types.
Examples
Automatic name based mapping
{ "id": 123, "name": "Product name", "price": 12.95}
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *name;@property (nonatomic) float price;@end
Model cascading (models including other models)
{ "orderId": 104, "totalPrice": 13.45, "product": { "id": 123, "name": "Product name", "price": 12.95 }}
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *name;@property (nonatomic) float price;@end@interface OrderModel : JSONModel@property (nonatomic) NSInteger orderId;@property (nonatomic) float totalPrice;@property (nonatomic) ProductModel *product;@end
Model collections
{ "orderId": 104, "totalPrice": 103.45, "products": [ { "id": 123, "name": "Product #1", "price": 12.95 }, { "id": 137, "name": "Product #2", "price": 82.95 } ]}
@protocol ProductModel;@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *name;@property (nonatomic) float price;@end@interface OrderModel : JSONModel@property (nonatomic) NSInteger orderId;@property (nonatomic) float totalPrice;@property (nonatomic) NSArray
Note: the angle brackets after NSArray contain a protocol. This is not the same as the Objective-C generics system. They are not mutually exclusive, but for JSONModel to work, the protocol must be in place.
Also property can have generics info for compiler
@interface OrderModel : JSONModel@property (nonatomic) NSInteger orderId;@property (nonatomic) float totalPrice;@property (nonatomic) NSArray
Nested key mapping
{ "orderId": 104, "orderDetails": { "name": "Product #1", "price": { "usd": 12.95 } }}
@interface OrderModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *productName;@property (nonatomic) float price;@end@implementation OrderModel+ (JSONKeyMapper *)keyMapper{ return [[JSONKeyMapper alloc] initWithModelToJSONDictionary:@{ @"id": @"orderId", @"productName": @"orderDetails.name", @"price": @"orderDetails.price.usd" }];}@end
Map automatically to snake_case
{ "order_id": 104, "order_product": "Product #1", "order_price": 12.95}
@interface OrderModel : JSONModel@property (nonatomic) NSInteger orderId;@property (nonatomic) NSString *orderProduct;@property (nonatomic) float orderPrice;@end@implementation OrderModel+ (JSONKeyMapper *)keyMapper{ return [JSONKeyMapper mapperForSnakeCase];}@end
Optional properties (i.e. can be missing or null)
{ "id": 123, "name": null, "price": 12.95}
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString
Ignored properties (i.e. JSONModel completely ignores them)
{ "id": 123, "name": null}
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString
Making scalar types optional
{ "id": null}
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@end@implementation ProductModel+ (BOOL)propertyIsOptional:(NSString *)propertyName{ if ([propertyName isEqualToString:@"id"]) return YES; return NO;}@end
Export model to NSDictionary or JSON
ProductModel *pm = [ProductModel new];pm.name = @"Some Name";// convert to dictionaryNSDictionary *dict = [pm toDictionary];// convert to jsonNSString *string = [pm toJSONString];
Custom data transformers
@interface JSONValueTransformer (CustomTransformer)@end@implementation JSONValueTransformer (CustomTransformer)- (NSDate *)NSDateFromNSString:(NSString *)string{ NSDateFormatter *formatter = [NSDateFormatter new]; formatter.dateFormat = APIDateFormat; return [formatter dateFromString:string];}- (NSString *)JSONObjectFromNSDate:(NSDate *)date{ NSDateFormatter *formatter = [NSDateFormatter new]; formatter.dateFormat = APIDateFormat; return [formatter stringFromDate:date];}@end
Custom getters/setters
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *name;@property (nonatomic) float price;@property (nonatomic) NSLocale *locale;@end@implementation ProductModel- (void)setLocaleWithNSString:(NSString *)string{ self.locale = [NSLocale localeWithLocaleIdentifier:string];}- (void)setLocaleWithNSDictionary:(NSDictionary *)dictionary{ self.locale = [NSLocale localeWithLocaleIdentifier:dictionary[@"identifier"]];}- (NSString *)JSONObjectForLocale{ return self.locale.localeIdentifier;}@end
Custom JSON validation
@interface ProductModel : JSONModel@property (nonatomic) NSInteger id;@property (nonatomic) NSString *name;@property (nonatomic) float price;@property (nonatomic) NSLocale *locale;@property (nonatomic) NSNumber
License
MIT licensed - see LICENSE file.
Contributing
We love pull requests! See CONTRIBUTING.md for full details.
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~