在我们的 ReSTful API 世界中,我们不断地向 API 发送 JSON 对象并接收回来。频繁地将这些对象序列化和反序列化到和从 JSON 字符串和字典中可能会很繁琐,并可能导致您的模型类和数据服务中充满了样板解析代码。
为解决这个问题,我介绍了 QJsonable。这是一个强大而简单的库,用于序列化和反序列化 JSON 对象。
简单地将您的模型类扩展为 QJsonable 类,世界就会成为您的贝壳。
QJsonable 使将对象转换为字典和字典数组变得轻而易举。它包括对嵌套模型对象、嵌套数组模型对象、多个日期序列化器的支持,轻松地从用户默认值中存储和加载对象,以及将您的数组数组和字典转换为 JSON 字符串以及相反。
QJsonable 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "QJsonable"
并导入以下头文件
#import "QJsonable.h"
此 Pod 在项目使用 Objective-C 或 Swift 时将工作。
创建一个模型类并扩展 QJSonable,并添加您的字段
//menu.h
@interface Menu : QJsonable
@property(nonatomic,strong)NSString * name;
@property(nonatomic,strong)NSArray * menuItems;
@end
现在您可以轻松地将字典和相反内容进行转换
//deserialize
menu = [Menu objectFromDictionary:dictionary];
//serialize again
dictionary = [menu toDictionary];
使用嵌套对象(即使嵌套数组)使用自定义日期序列化器
//restaurant.h
@interface Restaurant : QJsonable
@property(nonatomic,strong)NSString * image_url;
@property(nonatomic,strong)NSString * name;
@property(nonatomic,strong)NSArray * menus;
@property(nonatomic,strong)DBTimeStamp * createdAt;
@end
//restaurant.m
+(Class)classForKey:(NSString*)key
{
if([key isEqualToString:@"menus"])
{
return [Menu class];
}
if([key isEqualToString:@"createdAt"])
{
return [DBTimeStamp class];
}
return [super classForKey:key];
}
如果字段名称与数据库名称不匹配,则可以自定义字段名称
+(Class)classForKey:(NSString*)key
{
if([key isEqualToString:@"menu_items"] || [key isEqualToString:@"menuItems"])
{
return [MenuItem class];
}
return [super classForKey:key];
}
//override in subclass to perform some custom deserizliation or change property keys
-(void)writeObjectFrom:(NSDictionary*)inputDictionary forKey:(NSString*)key toProperty:(NSString*)property
{
//adjust the property name since the database is formatted with _'s instead of camel case
if([property isEqualToString:@"menu_items"])
{
property = @"menuItems";
}
[super writeObjectFrom:inputDictionary forKey:key toProperty:property];
}
//override in subclass to specify a new key or perform some custom action on serialize
-(void)serializeObject:(NSObject*)object withKey:(NSString*)key toDictionary:(NSMutableDictionary*)dictionary
{
//adjust the property name since the database is formatted with _'s instead of camel case
if([key isEqualToString:@"menuItems"])
{
key = @"menu_items";
}
[super serializeObject:object withKey:key toDictionary:dictionary];
}
直接写入首选项
[self.restaurant writeToPreferencesWithKey:@"data"];
self.restaurant = [Restaurant readFromPrefencesWithKey:@"data"];
将字符串转换为和相反
@interface NSDictionary (QJson)
-(NSString*)toJsonString;
+(NSDictionary*)fromJsonString:(NSString*)json;
@end
@interface NSArray (QJson)
-(NSString*)toJsonString;
+(NSArray*)fromJsonString:(NSString*)json;
@end
-Boolean -NSString -NSArray -NSNumber
-2015-12-30
-2015-01-01T10:15:30
-0312345512
-12:00:00
请注意,您可以通过调用来自定义日期格式
[DBDate setDateFormat:@"MM/DD/YYYY"];
在这个存储库中以及在安卓目录中,您还会找到一个非常类似的类,QJsonable.java,该类为Android和其他Java平台提供了非常相似的功能。
Logan Sease, [email protected]
QJsonable基于MIT许可提供。有关更多信息,请参阅LICENSE文件。