將JSON字典自動裝填到OBJC對象的IOS類庫:RFJModel
一個可以將JSON字典自動裝填到OBJC對象的IOS類庫。相比JSONModel有一些非常好的特性,使用上也比較簡單。
RFJModel是一個IOS類庫,可以將JSON字典自動裝填到OBJC對象。相比JSONModel有一些非常好的特性,使用上也比較簡單。
RFJModel有以下幾個特點
1、聲明時確定裝填行為。
RFJModel使用JProperty宏,以聲明此屬性是否用于JSON裝填,裝填類型,以及在JSON中的KEY。
下面的例子聲明了一個value_NSString屬性,他會將字典中的map_value_NSString字段,轉換為NSString,設置到屬性value_NSString。
@interface ExampleJModel : RFJModel JProperty(NSString *value_NSString, map_value_NSString); @end @implementation ExampleJModel @end { "map_value_NSString":"hello world", }
NSDictionary *json = ...; ExampleJModel *model = [[ExampleJModel alloc] initWithJsonDict:json]; NSLog(@"%@", model.value_NSString);
2、RFJModel支持JProperty、@property混合聲明,不相互影響。
下面的例子中只有value_NSString屬性被自動裝填,tag屬性不被RFJModel所管理
@interface ExampleJModel : RFJModel JProperty(NSString *value_NSString, map_value_NSString); @property (nonatomic, assign) int64_t tag; @end
3、RFJModel設計的目的之一,是為了盡可能減少由于服務端接口定義或返回有誤導致IOS客戶端崩潰的問題。所以引入以下幾個特性
- 所有的[NSNull null]對象都會被適當轉換,不會賦值到JProperty屬性。(因缺乏對[NSNull null]防護導致的崩潰,是JSON解析崩潰最主要的原因)
- 賦值時,會根據JProperty聲明的屬性類型對JSON值進行轉換。比如JSON中的Number賦值時可以被自動轉換為NSString。
- JSON字典中多余或者缺失的字段不報錯。
4、RFJModel支持繼承 @interface ExampleJModel : RFJModel
JProperty(NSString *value_NSString, map_value_NSString);
@property (nonatomic, assign) int64_t tag;
@end
@interface ExampleJSubModel : ExampleJModel
JProperty(NSString *name, name);
@end
{
"map_value_NSString":"hello world",
"name":"Tom",
}
NSDictionary *json = ...;
ExampleJModel *model = [[ExampleJModel alloc] initWithJsonDict:json];
NSLog(@"%@", model.value_NSString); // "hello world"
NSDictionary *json = ...;
ExampleJSubModel *model = [[ExampleJSubModel alloc] initWithJsonDict:json];
NSLog(@"%@", model.value_NSString); // "hello world"
NSLog(@"%@", model.name); // "Tom"
5、JProperty支持的類型包括RFJModel的子類。 @interface ExampleJModel : RFJModel
JProperty(NSString *value_NSString, map_value_NSString);
@property (nonatomic, assign) int64_t tag;
JProperty(ExampleJUserInfo *userInfo, UserInfo);
@end
@interface ExampleJUserInfo : RFJModel
JProperty(NSString *name, name);
@end
{
"map_value_NSString":"hello world",
"UserInfo":
{
"name":"Tom",
},
}
6、JProperty支持的類型包括RFJModel子類的數組。 @protocol ExampleJUserInfo
@end
@interface ExampleJModel : RFJModel
JProperty(NSString *value_NSString, map_value_NSString);
@property (nonatomic, assign) int64_t tag;
JProperty(NSArray<ExampleJUserInfo> *userInfos, UserInfos);
@end
@interface ExampleJUserInfo : RFJModel
JProperty(NSString *name, name);
@end
{
"map_value_NSString":"hello world",
"UserInfos":[
{
"name":"Tom",
},
{
"name":"Alice",
},
],
}
7、JProperty支持NSMutableString、NSMutableArray、NSMutableDictionary可變類型。同時NSMutableArray、NSMutableDictionary嵌套的容器也將盡可能轉換為可變類型。
8、JProperty只支持下面的類型聲明。如非以下類型被聲明,將在第一次使用時拋出異常
- BOOL
- Number(NSInteger, short, long long, double, etc)
- NSString
- NSMutableString
- NSArray
- NSMutableArray
- NSDictionary
- NSMutableDictionary
- RFJModel's subclass
- NSArray (RFJModel's subclass)
- NSMutableArray (RFJModel's subclass)
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!