將JSON字典自動裝填到OBJC對象的IOS類庫:RFJModel

jopen 9年前發布 | 13K 次閱讀 RFJModel iOS開發 移動開發

一個可以將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)

項目主頁:http://www.baiduhome.net/lib/view/home/1420510266312

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!