Reputation: 4107
I'm very new to Mac development and I'm having some troubles finding good resources. My current problem is a custom objective-c class object serialization to JSON.
I know that there is a built-in serializer in apple libraries, but that one works only with Foundation objects.
In my case I have my own class that looks like this:
@interface SomeClass : NSObject
{
int a;
int b;
NSString *aa;
NSString *bb;
}
@property int a,b;
@property NSString *aa,*bb;
@end
If anyone knows how to serialize this type of structure to a JSON please give me a hint! Any kind of relevant information would help! Thank you!
Upvotes: 0
Views: 760
Reputation: 1305
I have been looking into this for the past week. I decided to write my own solution. It is very simple and built upon existing Apple functionality.
See here: https://github.com/gslinker/GSObject
And here: http://digerati-illuminatus.blogspot.com/2016/01/objective-c-and-json-convert-subclass.html
For your data model object have it inherit from GSObject instead of NSObject. Here is an example of ThingOne with inherits from GSObject:
ThingOne* object1 = [[ThingOne alloc] init];
object1.name = @"John Jones";
NSData* jsonData1 = [object1 toJsonDataWithOptions:NSJSONWritingPrettyPrinted];
NSString *jsonString1 = [object1 toJsonStringWithOptions:NSJSONWritingPrettyPrinted];
NSDictionary<NSString *,id> *dict1 = [GSObject dictionaryWithValues:object1];
NSString *roundTripJson1 = [object1 toJsonStringWithOptions:NSJSONWritingPrettyPrinted];
//
// ThingOne.h
// JasonStuff
//
// Created by Geoffrey Slinker on 12/28/15.
// Copyright © 2015 Slinkworks LLC. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "GSObject.h"
#import "ThingTwo.h"
@interface ThingOne : GSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) ThingTwo *thingTwo;
@property (nonatomic, retain) NSArray *values;
@property (nonatomic, retain) NSDictionary *dict;
@property int myInt;
@property float myFloat;
@property BOOL myBool;
@property (nonatomic, retain) NSNumber* someMoney;
@end
//
// ThingOne.m
// JasonStuff
//
// Created by Geoffrey Slinker on 12/28/15.
// Copyright © 2015 Slinkworks LLC. All rights reserved.
//
#import "ThingOne.h"
@implementation ThingOne
@synthesize name;
@synthesize thingTwo;
@synthesize values;
@synthesize dict;
@synthesize myInt;
@synthesize myFloat;
@synthesize myBool;
@synthesize someMoney;
- (instancetype)init
{
self = [super init];
thingTwo = [[ThingTwo alloc] init];
thingTwo.stuff = @"Thing Two Stuff";
thingTwo.someOtherStuff = @"Thing Two Other Stuff";
NSDateFormatter *dateFormater = [[NSDateFormatter alloc]init];
[dateFormater setDateFormat:@"yyyy-mm-dd"];
thingTwo.someDate = [dateFormater dateFromString:@"1963-10-07"];
values = [NSArray arrayWithObjects:@"Value1", @"Value2", @"Value3", nil];
dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];
myInt = 5431;
myFloat = 123.456f;
myBool = YES;
someMoney = [NSNumber numberWithInt:503];
return self;
}
@end
//
// ThingTwo.h
// JasonStuff
//
// Created by Geoffrey Slinker on 12/28/15.
// Copyright © 2015 Slinkworks LLC. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "GSObject.h"
@interface ThingTwo : GSObject
@property (nonatomic, retain) NSString *stuff;
@property (nonatomic, retain) NSString *someOtherStuff;
@property (nonatomic, retain) NSDate *someDate;
@property (nonatomic, retain) NSString *nullString;
@property (nonatomic, retain) NSDate *nullDate;
@end
//
// ThingTwo.m
// JasonStuff
//
// Created by Geoffrey Slinker on 12/28/15.
// Copyright © 2015 Slinkworks LLC. All rights reserved.
//
#import "ThingTwo.h"
@implementation ThingTwo
@synthesize stuff;
@synthesize someOtherStuff;
@synthesize someDate;
- (instancetype)init
{
self = [super init];
someDate = [NSDate date];
return self;
}
@end
Here is an example of the JSON output:
{
"values" : [
"Value1",
"Value2",
"Value3"
],
"myInt" : 5431,
"myFloat" : 123.456,
"myBool" : true,
"someMoney" : "$503.00",
"thingTwo" : {
"stuff" : "Thing Two Stuff",
"nullDate" : null,
"someDate" : "1963-01-07 07:10:00 +0000",
"nullString" : null,
"someOtherStuff" : "Thing Two Other Stuff"
},
"name" : "John Jones",
"dict" : {
"key1" : "value1",
"key2" : "value2"
}
}
Upvotes: 0
Reputation: 385600
If you just want to serialize an object that contains integers and strings, the easiest way is to create a data structure that NSJSONSerialization
supports and serialize that:
static const NSString *kAKey = @"a";
static const NSString *kBKey = @"b";
static const NSString *kAaKey = @"aa";
static const NSString *kBbKey = @"bb";
- (id)JSONObject {
return @{
kAKey: @(self.a),
kBKey: @(self.b),
kAaKey: self.aa,
kBbKey: self.bb
};
}
- (NSData *)JSONData {
return [NSJSONSerialization dataWithJSONObject:[self JSONObject] options:0 error:NULL];
}
Upvotes: 1