QJsonable 0.2.0

QJsonable 0.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2016年1月

Logan Sease维护。



QJsonable 0.2.0

  • 作者
  • Logan Sease

概述

在我们的 ReSTful API 世界中,我们不断地向 API 发送 JSON 对象并接收回来。频繁地将这些对象序列化和反序列化到和从 JSON 字符串和字典中可能会很繁琐,并可能导致您的模型类和数据服务中充满了样板解析代码。

为解决这个问题,我介绍了 QJsonable。这是一个强大而简单的库,用于序列化和反序列化 JSON 对象。

简单地将您的模型类扩展为 QJsonable 类,世界就会成为您的贝壳。

QJsonable 使将对象转换为字典和字典数组变得轻而易举。它包括对嵌套模型对象、嵌套数组模型对象、多个日期序列化器的支持,轻松地从用户默认值中存储和加载对象,以及将您的数组数组和字典转换为 JSON 字符串以及相反。

安装

QJsonable 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod "QJsonable"

并导入以下头文件

#import "QJsonable.h"

此 Pod 在项目使用 Objective-C 或 Swift 时将工作。

  • 为了在 Objective-C 项目中获得最佳结果,将 SeaseAssist.h 导入到您的 .pch 文件中,您就不需要将 SeaseAssist 导入到引用它的每个类中了。
  • 为了在 Swift 项目中获得类似的结果,您不应该在 pod 文件中包含 use_frameworks!,并添加一个包含图书馆的桥接头。如果您必须使用 use_frameworks!,那么您需要在使用其函数的任何类中包含 SeaseAssist。-- 在您的项目中创建一个名为 ProjectName-Bridging-Header.h 的新头文件 -- 在您的头文件中添加 '#import ' -- 在您的目标构建设置 > Swift 编译器代码生成 > Objective-C 桥接头,添加对新创建的文件的引用。应该是 [ProjectName/ProjectName-Bridging-Header.h]

用法

创建一个模型类并扩展 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

自定义日期序列化器

DBDate

-2015-12-30

DBDateTime

-2015-01-01T10:15:30

DBDateTimeStamp

-0312345512

DBTime

-12:00:00

请注意,您可以通过调用来自定义日期格式

[DBDate setDateFormat:@"MM/DD/YYYY"];

Android

在这个存储库中以及在安卓目录中,您还会找到一个非常类似的类,QJsonable.java,该类为Android和其他Java平台提供了非常相似的功能。

作者

Logan Sease, [email protected]

许可

QJsonable基于MIT许可提供。有关更多信息,请参阅LICENSE文件。