5

如何在objective-c中序列化以下类,以便与SBJson一起使用?

使用此代码时出现“Animal 不支持 JSON 序列化”错误。

有人可以指出我哪里出错了吗?

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
4

7 回答 7

9

使您的自定义类符合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
于 2012-01-19T06:01:38.467 回答
4

要实际回答您有关如何使用 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;
            }
    ...
    }
}

像这样实现proxyForJsonAnimal.m未测试):

- (NSDictionary*) proxyForJson
{
return [NSDictionary dictionaryWithObjectsAndKeys:self.name, @"name",
                                                  self.description, @"description",
                                                  self.imageURL, @"imageURL", 
                                                  nil];
}
于 2012-06-07T16:01:00.063 回答
3

检查新引入的 NSJSONSerialization 类:

NSJSONSerialization 类

于 2012-01-19T06:15:04.930 回答
3

这个开源项目JSONCoding使整个过程非常简单,使用新的 sdk 类和 NSCoding 协议。

于 2012-12-17T00:55:30.500 回答
2

如果对您有帮助,我想您可以查看一下:Make a Custom Class Serializable

于 2012-01-19T06:53:24.853 回答
0

另请参阅https://github.com/jsonmodel/jsonmodel

JSON 的神奇数据建模框架 - 允许快速创建智能数据模型。您可以在您的 iOS、macOS、watchOS 和 tvOS 应用程序中使用它。

这也是 Objective-c Swagger 客户端选择的库。

于 2018-04-02T00:27:01.873 回答