Mantle 是一個(gè)開源的 Objective-C 框架,用于在 iOS 和 macOS 應(yīng)用程序中實(shí)現(xiàn)模型層的序列化和反序列化。它提供了一種簡單而強(qiáng)大的方式來將 JSON數(shù)據(jù)格式轉(zhuǎn)換為自定義的數(shù)據(jù)模型對象,以及將數(shù)據(jù)模型對象轉(zhuǎn)換為字典或 JSON 格式。
Mantle具有如下特點(diǎn)
自動(dòng)映射
Mantle自動(dòng)將 JSON 數(shù)據(jù)與模型屬性進(jìn)行映射,無需手動(dòng)解析和賦值。
支持嵌套
Mantle 支持在模型中嵌套其他模型對象。
支持集合
Mantle 支持?jǐn)?shù)組和字典等集合類型。你可以將集合類型的屬性映射到 JSON 數(shù)組或字典,并在Model中進(jìn)行使用
屬性轉(zhuǎn)換
Mantle 允許你自定義屬性值的轉(zhuǎn)換。你可以定義自定義的屬性轉(zhuǎn)換方法,將屬性的類型轉(zhuǎn)換為其他類型,或者根據(jù)需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換,以適應(yīng)模型和外部數(shù)據(jù)的差異。
安裝
在CocoaPods的Podfile中添加
pod 'Mantle', '~> 2.2.0'
執(zhí)行pod install,安裝成功后,工程可以使用Mantle了。
使用Mantle解析JSON
現(xiàn)有json文件
{
"name": "John Doe",
"age": 25,
"address": {
"city": "New York",
"country": "USA"
},
"interests": ["reading", "traveling", "photography"]
}
為了從json轉(zhuǎn)換為Objective-C的Model,我們可以寫出Model類
#import <Mantle/Mantle.h>
//嵌套的類型
@interface AddressModel : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy) NSString *city;
@property (nonatomic, copy) NSString *country;
@end
@implementation AddressModel
//映射字典,屬性city對應(yīng)JSON里面的city,country對應(yīng)JSON里面的country
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"city": @"city",
@"country": @"country"
};
}
@end
@interface UserModel : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, strong) AddressModel *address;
@property (nonatomic, strong) NSArray<NSString *> *interests;
@end
@implementation UserModel
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"name": @"name",
@"age": @"age",
@"address": @"address",
@"interests": @"interests"
};
}
//對于嵌套類型,需要添加JSONTransformer
+ (NSValueTransformer *)addressJSONTransformer {
return [MTLJSONAdapter dictionaryTransformerWithModelClass:AddressModel.class];
}
//對于集合類型,需要添加JSONTransformer
+ (NSValueTransformer *)interestsJSONTransformer {
return [MTLJSONAdapter arrayTransformerWithModelClass:NSString.class];
}
@end
上面這個(gè)例子演示了Mantle的屬性轉(zhuǎn)換,嵌套類型,集合類型的使用方法,需要注意的是每個(gè)Model都需要繼承自MTLModel類,并且實(shí)現(xiàn)MTLJSONSerializing協(xié)議。
如果需要做類型轉(zhuǎn)化,比如string類型轉(zhuǎn)換為Date類型,可以使用NSValueTransformer來實(shí)現(xiàn),這個(gè)時(shí)候需要在自定義的Model添加dateValueTransformer方法,運(yùn)行的時(shí)候會自動(dòng)調(diào)用dateValueTransformer方法完成類型轉(zhuǎn)換。
+ (NSValueTransformer *)dateValueTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(id value, BOOL *success, NSError *__autoreleasing *error) {
if ([value isKindOfClass:NSDate.class]) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
return [formatter stringFromDate:value];
}
return nil;
} reverseBlock:^id(id value, BOOL *success, NSError *__autoreleasing *error) {
if ([value isKindOfClass:NSString.class]) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
return [formatter dateFromString:value];
}
return nil;
}];
}
完成Model類的JSON轉(zhuǎn)換規(guī)則后,我們只需要調(diào)用modelOfClass方法即可把JSON轉(zhuǎn)化為Model類,使用起來是很簡單的。
UserModel *user = [MTLJSONAdapter modelOfClass:UserModel.class fromJSONDictionary:json error:&error];
使用Mantle把Model轉(zhuǎn)換為JSON
現(xiàn)有Model定義如下文章來源:http://www.zghlxwxcb.cn/news/detail-503004.html
// 創(chuàng)建模型對象
UserModel *person = [[UserModel alloc] init];
person.name = @"John";
person.age = 20;
person.birthDate = [NSDate date];
如果要轉(zhuǎn)換為JSON,只需要調(diào)用JSONDictionaryFromModel方法文章來源地址http://www.zghlxwxcb.cn/news/detail-503004.html
// 進(jìn)行序列化
NSDictionary *jsonDictionary = [MTLJSONAdapter JSONDictionaryFromModel:person];
到了這里,關(guān)于iOS處理json,序列化和反序列化的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!