Как сериализовать класс в IOS SDK (Objective-C)? - PullRequest
4 голосов
/ 19 января 2012

Как сериализовать следующий класс в target-c, чтобы его можно было использовать с SBJson?

При использовании этого кода появляется ошибка «Сериализация JSON не поддерживается для Animal».

Может кто-нибудь указать, где я иду не так?

Содержимое файла Animal.h:

#import <UIKit/UIKit.h>

@interface Animal : NSObject<NSCoding> {
    NSString *name;
    NSString *description;
    NSString *imageURL;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *description;
@property (nonatomic, retain) NSString *imageURL;

-(id)initWithName:(NSString *)n description:(NSString *)d url:(NSString *)u;

@end

Содержимое файла Animal.m:

#import "Animal.h"

@implementation Animal
@synthesize name, description, imageURL;

-(id)initWithName:(NSString *)n description:(NSString *)d url:(NSString *)u {
    self.name = n;
    self.description = d;
    self.imageURL = u;
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super initWithCoder:aDecoder])
    {
        name = [[aDecoder decodeObjectForKey:@"name"] retain];
        description = [[aDecoder decodeObjectForKey:@"description"] retain];
        imageURL = [[aDecoder decodeObjectForKey:@"imageURL"] retain];
    }
    return [self initWithName:name description:description url:imageURL];
}

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [super encodeWithCoder:encoder];
    [encoder encodeObject:name forKey:@"name"];
    [encoder encodeObject:description forKey:@"description"];
    [encoder encodeObject:imageURL forKey:@"imageURL"];
}    

@end

Ответы [ 7 ]

7 голосов
/ 19 января 2012

Настройте собственный класс на соответствие протоколу NSCoding, а затем сериализуйте его.

Для получения дополнительной информации посетите документацию Apple

Кроме того, эта ссылка также поможет вам. Как предлагается в этой ссылке, заархивируйте свой пользовательский класс в NSData и сериализуйте его, как указано в документации Apple.

Редактировать Сделайте ваш Animal.m следующим образом:

#import "Animal.h"

@implementation Animal
@synthesize name, description, imageURL;

-(id)initWithName:(NSString *)n description:(NSString *)d url:(NSString *)u {
    self = [super init];
    if( self )
    {
       self.name = n;
       self.description = d;
       self.imageURL = u;
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if( self )
    {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.description = [aDecoder decodeObjectForKey:@"description"];
        self.imageURL = [aDecoder decodeObjectForKey:@"imageURL"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:name forKey:@"name"];
    [encoder encodeObject:description forKey:@"description"];
    [encoder encodeObject:imageURL forKey:@"imageURL"];
}    

@end
4 голосов
/ 07 июня 2012

Чтобы ответить на ваш вопрос о том, как это сделать , используя SBJson : Реализуйте метод proxyForJson. Если вы не сериализуете NSArray или NSDictionary, вы должны переопределить этот метод для работы сериализации.

Вы можете увидеть, что это так, посмотрев исходный код SBJson (в SBJsonWriter.m):

- (NSData*)dataWithObject:(id)object {    
...   
    if ([object isKindOfClass:[NSDictionary class]])
                ok = [streamWriter writeObject:object];

            else if ([object isKindOfClass:[NSArray class]])
                ok = [streamWriter writeArray:object];

            else if ([object respondsToSelector:@selector(proxyForJson)])
                return [self dataWithObject:[object proxyForJson]];
            else {
                self.error = @"Not valid type for JSON";
                return nil;
            }
    ...
    }
}

Реализация proxyForJson в Animal.m, как это (не проверено):

- (NSDictionary*) proxyForJson
{
return [NSDictionary dictionaryWithObjectsAndKeys:self.name, @"name",
                                                  self.description, @"description",
                                                  self.imageURL, @"imageURL", 
                                                  nil];
}
3 голосов
/ 17 декабря 2012

Этот проект с открытым исходным кодом JSONCoding делает весь процесс довольно простым, используя новый класс SDK в сочетании с протоколом NSCoding.

3 голосов
/ 19 января 2012

Проверьте недавно представленный класс NSJSONSerialization:

Класс NSJSONSerialization

2 голосов
/ 19 января 2012

Я думаю, вы можете проверить это, если это поможет вам: Сделать пользовательский класс сериализуемым

0 голосов
/ 02 апреля 2018

См. Также https://github.com/jsonmodel/jsonmodel

Magical Data Modeling Framework для JSON - позволяет быстро создавать умные модели данных. Вы можете использовать его в iOS, macOS, watchOS и tvOS приложения.

Это также выбранная библиотека для клиента Objective-c Swagger.

...