一个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表示,作为NSArray
或NSDictionary
。YAJL-Entity提供了一个- (NSDictionary *)dictionaryOfProperty
方法,可以创建包含此项目所有属性和值的NSDictionary
。通常,您可以在所有模型共通父类中实现此方法。
JSON字符串属性的生成名称与ObjC类中的名称相同。如果您想使用蛇形命名,可以使用- (NSDictionary *)dictionaryOfProperytiesWithOption:
代替。
目前YAJL-Entity不支持嵌套数组。幸运的是,这种情况并不常见。