# jastor
**Repository Path**: ibiart/jastor
## Basic Information
- **Project Name**: jastor
- **Description**: Auto translates NSDictionary to instances of Objective-C classes, supporting nested types and arrays
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2015-02-26
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Jastor
===
### Jastor is not maintained anymore. No worries, there are some really good alternatives: [JSONModel](https://github.com/icanzilb/JSONModel) or [Mantle](https://github.com/Mantle/Mantle)
Jastor is an Objective-C base class that is initialized with a dictionary (probably from your JSON response), and assigns dictionary values to all its (derived class's) typed @properties.
It supports nested types, arrays, NSString, NSNumber, NSDate and more.
Jastor is NOT a JSON parser. For that, you have [JSONKit](https://github.com/johnezang/JSONKit), [yajl](https://github.com/gabriel/yajl-objc) and many others.
The name sounds like **JSON to Object**er. Or something.
**Upgrade from previous version:**
Add `dealloc` mehtods to your models and nillify your peoperties. Automattic `dealloc` is no longer done by Jastor.
Support
---
Need help with getting Jastor up and running? Got a time-consuming problem you want to get solved quickly?
Get [Jastor support on CodersClan](http://codersclan.net/?repo_id=327).

Examples
---
You have the following JSON:
```json
{
"name": "Foo",
"amount": 13
}
```
and the following class:
```objc
@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
```
with Jastor, you can just inherit from `Jastor` class, and use `initWithDictionary:`
```objc
// 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
```
Nested Objects
---
Jastor also converts nested objects to their destination type:
```js
// JSON
{
"name": "Foo",
"category": {
"name": "Bar Category"
}
}
```
```objc
// 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 // =>
product.category.name // => Bar Category
```
Arrays
---
Having fun so far?
Jastor also supports arrays of a certain type:
```js
// JSON
{
"name": "Foo",
"categories": [
{ "name": "Bar Category 1" },
{ "name": "Bar Category 2" },
{ "name": "Bar Category 3" }
]
}
```
```objc
// 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 // =>
[product.categories count] // => 3
[product.categories objectAtIndex:1] // =>
[[product.categories objectAtIndex:1] name] // => Bar Category 2
```
Notice the declaration of
```objc
+ (Class)categories_class {
return [ProductCategory class];
}
```
it tells Jastor what class of items the array holds.
Nested + Arrays = Trees
---
Jastor can handle trees of data:
```js
// 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" }
]
}
```
```objc
// 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 // =>
[category.children count] // => 3
[category.children objectAtIndex:1] // =>
[[category.categories objectAtIndex:1] name] // => 1.2
[[[category.children objectAtIndex:1] children] objectAtIndex:0] // =>
[[[[category.children objectAtIndex:1] children] objectAtIndex:0] name] // => 1.2.1.2
```
Custom mapping
---
If you are receiving a json from a web server:
```json
{
"first_name": "John",
"last_name": "Doe"
}
```
```objc
// Person.h
@interface Person : Jastor
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@end
// Person.m
@implementation Person
@synthesize firstName, lastName;
- (void)dealloc {
[firstName release]; firstName = nil;
[lastName release]; lastName = nil;
[super dealloc];
}
- (NSDictionary *)map{
NSMutableDictionary *map = [NSMutableDictionary dictionaryWithDictionary:[super map]];
[map setObject:@"first_name" forKey:@"firstName"];
[map setObject:@"last_name" forKey:@"lastName"];
return [NSDictionary dictionaryWithDictionary:map];
}
@end
// Code
NSDictionary *dictionary = /* parse the JSON response to a dictionary */;
Person *person = [[Person alloc] initWithDictionary:dictionary];
// Log
person.firstName // => John
person.lastName // => Doe
```
How does it work?
---
Runtime API. The class's properties are read in runtime and assigns all values from dictionary to these properties with `NSObject setValue:forKey:`. For Dictionaries, Jastor instantiates a new class, based on the property type, and issues another `initWithDictionary`. Arrays are only a list of items such as strings (which are not converted) or dictionaries (which are treated the same as other dictionaries).
Installation
---
Just copy Jastor.m+.h and JastorRuntimeHelper.m+.h to your project, create a class, inherit, use the `initWithDictionary` and enjoy!
Testing
---
Make sure to initialize git submodules.
```bash
git submodules init
git submodules update
```
In Xcode, hit CMD+U under iPhone simulator scheme.
REALLY Good to know
---
**What about properties that are reserved words?**
As for now, `id` is converted to `objectId` automatically. Maybe someday Jastor will have ability to map server and obj-c fields.
**Jastor classes also conforms to NSCoding protocol**
So you get `initWithCoder`/`encodeWithCoder` for free.
**You can look at the tests for real samples**.
Alternatives
---
* [KVCObjectMapping](https://github.com/tuyennguyencanada/KVCObjectMapping)
* [ManagedJastor](https://github.com/patternoia/ManagedJastor) - for `NSManageObject`s
* [RestKit](http://restkit.org/)
Contributors
---
* **Elad Ossadon** [@elado](http://twitter.com/elado)
* **Yosi Taguri** [@yosit](http://github.com/yosit)