jastor 0.2.1

jastor 0.2.1

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

未声明维护。



jastor 0.2.1

  • 作者:
  • Elad Ossadon

Jastor

Jastor是一个基于Objective-C的基类,它使用字典(可能是从您的JSON响应中得到的)进行初始化,并将字典值分配给它所有(派生类)的(类型化)@properties。

它支持嵌套类型、数组、NSString、NSNumber、NSDate等多重类型。

Jastor不是一个JSON解析器。对于这个功能,您有JSONKityajl和其他许多工具。

这个名字听起来像是《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

Jastor是如何工作的?

运行时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 方法。

你可以查看测试示例.

替代方案

贡献者