iOS处理json,序列化和反序列化

Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。

Mantle具有如下特点

自动映射

Mantle自动将 JSON 数据与模型属性进行映射,无需手动解析和赋值。

支持嵌套

Mantle 支持在模型中嵌套其他模型对象。

支持集合

Mantle 支持数组和字典等集合类型。你可以将集合类型的属性映射到 JSON 数组或字典,并在Model中进行使用

属性转换

Mantle 允许你自定义属性值的转换。你可以定义自定义的属性转换方法,将属性的类型转换为其他类型,或者根据需要进行数据转换,以适应模型和外部数据的差异。

安装

在CocoaPods的Podfile中添加

pod 'Mantle', '~> 2.2.0'

执行pod install,安装成功后,工程可以使用Mantle了。

使用Mantle解析JSON

现有json文件

{
  "name": "John Doe",
  "age": 25,
  "address": {
    "city": "New York",
    "country": "USA"
  },
  "interests": ["reading", "traveling", "photography"]
}

为了从json转换为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对应JSON里面的city,country对应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

上面这个例子演示了Mantle的属性转换,嵌套类型,集合类型的使用方法,需要注意的是每个Model都需要继承自MTLModel类,并且实现MTLJSONSerializing协议。

如果需要做类型转化,比如string类型转换为Date类型,可以使用NSValueTransformer来实现,这个时候需要在自定义的Model添加dateValueTransformer方法,运行的时候会自动调用dateValueTransformer方法完成类型转换。

+ (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转换规则后,我们只需要调用modelOfClass方法即可把JSON转化为Model类,使用起来是很简单的。

UserModel *user = [MTLJSONAdapter modelOfClass:UserModel.class fromJSONDictionary:json error:&error];

使用Mantle把Model转换为JSON

现有Model定义如下

// 创建模型对象
UserModel *person = [[UserModel alloc] init];
person.name = @"John";
person.age = 20;
person.birthDate = [NSDate date];

如果要转换为JSON,只需要调用JSONDictionaryFromModel方法

// 进行序列化
NSDictionary *jsonDictionary = [MTLJSONAdapter JSONDictionaryFromModel:person];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值