YAJL-Entity 1.0.2

YAJL-Entity 1.0.2

测试测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

王毅维护。



  • 李华

一个JSON框架,可以将JSON字符串/数据直接反序成Objective-C对象,而不是像其他框架中的NSDictionary和NSArray那样。

RestKit不同,RestKit需要声明对象映射,YAJL-Entity不需要此类配置。属性名称会自动映射,支持蛇形化和驼峰式命名转换。嵌套对象类型由ObjC类中属性的声明类型决定。对于数组,需要额外的配置,这相当简单。请参见“快速演示”部分。

我已经使用了3年,在多个项目上,其中大多数是内部应用。这是yajl-objc库的一个扩展,但作者不接受我的 pull request。所以我将其作为一个独立的项目发布。

安装

Cocoapods推荐。在您的Podfile

pod 'YAJL-Entity'

快速演示

检查该项目的测试。在YAJL_EntityTest.m

NSString *path = [[NSBundle mainBundle] pathForResource:@"my-entity.json" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:path];

// Deserialization
MyEntity *entity = [data objectFromJSONOfType:[MyEntity class]];

// Serialization.
// You have to implement - (id)JSON method in your entity class. This is easy to do. See the next section.
NSString *jsonString = [entity yajl_JSONString];

MyEntity.m中,以下代码是必须的,以使数组生效。

// A informal protocol. By default it simply calls [self init
// Override this only if your class has properties to be deserialzed which are NSArray or NSMutableArray
- (id)initForYAJL
{
    if ((self = [super initForYAJL])) {
    // Assign the class object to the array property as a hint.
    // It will be safely removed after the deserialization process. 
        self.addresses = (NSArray *)[MyAddress class];
    }

    return self;
}

通过查看类MyEntity的定义,你可以找到一个数组属性,其中一个包含自定义对象,另一个包含原始数据,还有一个属性来自其他模型类。所以这足以应对大多数情况。

你可以通过查看类MyEntity的定义来找到它有两个数组属性,一个包含自定义对象,另一个包含原始数据,还有一个属性来自其他模型类。所以这足以应对大多数情况。

约定优于配置

通常Objective-C中的名称使用驼峰式命名。来自其他语言的蛇形命名可以自动转换。

为了支持将对象序列化成JSON字符串,您必须实现- (id)JSON方法。以下是一个示例,您可以将其添加到实体共通父类中。

- (id)JSON
{
    return [self dictionaryOfProperyties];
}

- (id)JSON方法是YAJL框架序列化对象所必需的。它应该返回对象的JSON表示,作为NSArrayNSDictionary。YAJL-Entity提供了一个- (NSDictionary *)dictionaryOfProperty方法,可以创建包含此项目所有属性和值的NSDictionary。通常,您可以在所有模型共通父类中实现此方法。

JSON字符串属性的生成名称与ObjC类中的名称相同。如果您想使用蛇形命名,可以使用- (NSDictionary *)dictionaryOfProperytiesWithOption:代替。

限制

目前YAJL-Entity不支持嵌套数组。幸运的是,这种情况并不常见。