Jastor是一个基于Objective-C的基类,它使用字典(可能是从您的JSON响应中得到的)进行初始化,并将字典值分配给它所有(派生类)的(类型化)@properties。
它支持嵌套类型、数组、NSString、NSNumber、NSDate等多重类型。
Jastor不是一个JSON解析器。对于这个功能,您有JSONKit、yajl和其他许多工具。
这个名字听起来像是《JSON到对象》器。或者类似的东西。
从旧版本升级
请给您的模型添加dealloc
方法,并清空您的属性。Jastor不再执行自动dealloc
。
需要帮助使Jastor启动并运行?有一个费时的问题您希望快速解决吗?
获取CodersClan上的Jastor支持。
您有以下JSON:
{
"name": "Foo",
"amount": 13
}
以及以下类:
@interface Product
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) NSNumber *amount;
@end
@implementation Product
@synthesize name, amount;
- (void)dealloc {
self.name = nil;
self.amount = nil;
[super dealloc];
}
@end
使用Jastor,您只需从Jastor
类继承,并使用initWithDictionary:
// Product.h
@interface Product : Jastor
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) NSNumber *amount;
@end
// Product.m
@implementation Product
@synthesize name, amount;
- (void)dealloc {
self.name = nil;
self.amount = nil;
[super dealloc];
}
@end
// Some other code
NSDictionary *dictionary = /* parse the JSON response to a dictionary */;
Product *product = [[Product alloc] initWithDictionary:dictionary];
// Log
product.name // => Foo
product.amount // => 13
Jastor还能将嵌套对象转换为它们的目标类型
// JSON
{
"name": "Foo",
"category": {
"name": "Bar Category"
}
}
// ProductCategory.h
@interface ProductCategory : Jastor
@property (nonatomic, copy) NSString *name;
@end
// ProductCategory.m
@implementation ProductCategory
@synthesize name;
- (void)dealloc {
self.name = nil;
[super dealloc];
}
@end
// Product.h
@interface Product : Jastor
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) ProductCategory *category;
@end
// Product.m
@implementation Product
@synthesize name, category;
- (void)dealloc {
self.name = nil;
self.category = nil;
[super dealloc];
}
@end
// Code
NSDictionary *dictionary = /* parse the JSON response to a dictionary */;
Product *product = [[Product alloc] initWithDictionary:dictionary];
// Log
product.name // => Foo
product.category // => <ProductCategory>
product.category.name // => Bar Category
现在能玩得开心吗?
Jastor也支持特定类型的数组
// JSON
{
"name": "Foo",
"categories": [
{ "name": "Bar Category 1" },
{ "name": "Bar Category 2" },
{ "name": "Bar Category 3" }
]
}
// ProductCategory.h
@interface ProductCategory : Jastor
@property (nonatomic, copy) NSString *name;
@end
// ProductCategory.m
@implementation ProductCategory
@synthesize name;
- (void)dealloc {
self.name = nil;
[super dealloc];
}
@end
// Product.h
@interface Product : Jastor
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) NSArray *categories;
@end
// Product.m
@implementation Product
@synthesize name, categories;
+ (Class)categories_class {
return [ProductCategory class];
}
- (void)dealloc {
self.name = nil;
self.categories = nil;
[super dealloc];
}
@end
// Code
NSDictionary *dictionary = /* parse the JSON response to a dictionary */;
Product *product = [[Product alloc] initWithDictionary:dictionary];
// Log
product.name // => Foo
product.categories // => <NSArray>
[product.categories count] // => 3
[product.categories objectAtIndex:1] // => <ProductCategory>
[[product.categories objectAtIndex:1] name] // => Bar Category 2
请注意
+ (Class)categories_class {
return [ProductCategory class];
}
它告诉Jastor数组中包含的项的类。
Jastor可以处理数据树
// JSON
{
"name": "1",
"children": [
{ "name": "1.1" },
{ "name": "1.2",
children: [
{ "name": "1.2.1",
children: [
{ "name": "1.2.1.1" },
{ "name": "1.2.1.2" },
]
},
{ "name": "1.2.2" },
]
},
{ "name": "1.3" }
]
}
// ProductCategory.h
@interface ProductCategory : Jastor
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) NSArray *children;
@end
// ProductCategory.m
@implementation ProductCategory
@synthesize name, children;
+ (Class)children_class {
return [ProductCategory class];
}
- (void)dealloc {
self.name = nil;
self.children = nil;
[super dealloc];
}
@end
// Code
NSDictionary *dictionary = /* parse the JSON response to a dictionary */;
ProductCategory *category = [[ProductCategory alloc] initWithDictionary:dictionary];
// Log
category.name // => 1
category.children // => <NSArray>
[category.children count] // => 3
[category.children objectAtIndex:1] // => <ProductCategory>
[[category.categories objectAtIndex:1] name] // => 1.2
[[[category.children objectAtIndex:1] children] objectAtIndex:0] // => <ProductCategory>
[[[[category.children objectAtIndex:1] children] objectAtIndex:0] name] // => 1.2.1.2
运行时API。类的属性在运行时中被读取,并使用NSObject setValue:forKey:
将所有字典值分配到这些属性。对于字典,Jastor根据属性类型实例化一个新的类,并发出另一个initWithDictionary
。数组只是一个包含诸如字符串(不会被转换)或字典(与其他字典同样处理)等项的列表。
只需将Jastor.m+.h和JastorRuntimeHelper.m+.h复制到您的项目中,创建一个类,继承它,使用initWithDictionary
,然后尽情享受吧!
请确保初始化git子模块。
git submodules init
git submodules update
在 Xcode 中,在 iPhone 模拟器方案下按 CMD+U。
那么关于保留字属性怎么办呢?
目前,id 会自动转换为 objectId。也许有一天 Jastor 将能将服务器和 obj-c 字段进行匹配。
Jastor 类也遵循 NSCoding 协议
因此你可以免费获得 initWithCoder/encodeWithCoder 方法。
你可以查看测试示例.
NSManageObject