Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在IOS sdk(Objective-c)中序列化类?_Iphone_Objective C_Json_Serialization_Sbjson - Fatal编程技术网

Iphone 如何在IOS sdk(Objective-c)中序列化类?

Iphone 如何在IOS sdk(Objective-c)中序列化类?,iphone,objective-c,json,serialization,sbjson,Iphone,Objective C,Json,Serialization,Sbjson,如何在objective-c中序列化以下类,以便与SBJson一起使用 当我使用此代码时,出现“JSON序列化不支持动物”错误 有人能指出我哪里出了问题吗 Animal.h文件的内容如下所示 #import <UIKit/UIKit.h> @interface Animal : NSObject<NSCoding> { NSString *name; NSString *description; NSString *imageURL; } @p

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

当我使用此代码时,出现“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
#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

使自定义类符合
NSCoding
协议,然后将其序列化

有关更多信息,请访问

而且,这也会对你有所帮助。 正如本链接中所建议的,将您的自定义类归档到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
请检查这个

这里有类似的帖子:


检查新引入的NSJSONSerialization类:


我想如果这对你有帮助的话,你可以检查一下:

要真正回答你关于如何使用SBJson做这件事的问题:
proxyForJson
方法。除非要序列化
NSArray
NSDictionary
否则必须重写此方法才能使序列化生效

通过查看SBJson源代码(在SBJsonWriter.m中),您可以看到这种情况:

Animal.m
中实现
proxyForJson
,如下所示(未测试):

这个开源项目使整个过程变得非常简单,将新的sdk类与NSCoding协议结合使用。

另请参见

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


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

我添加了以下方法,如“在Objective-c/iPhone中使自定义类可序列化?”一文中所述,但仍然收到错误消息,即“动物不支持JSON序列化”-(id)initWithCoder:(NSCoder*)aDecoder;-(void)编码器与编码器:(NSCoder*)编码器;你让这个类符合
NSCoding
协议了吗?我对编写IPhone应用程序的代码还不熟悉。你能看看我的原始问题中的源代码并指出我的错误所在吗?我已经添加了以下方法,正如在这个链接中所说的,但我仍然得到错误消息“JSON序列化不支持动物”-(id)initWithCoder:(NSCoder*)aDecoder;-(void)编码器与编码器:(NSCoder*)编码器;我认为nscoding是一个协议,我们应该以这种方式实现,但是如果你还没有理解我的观点,那么请勾选这一个。目的与教程不同,但是你可以从这里学习nscoding的用法。我想……我已经用源代码更新了原始问题,并在链接中建议了更改第二个链接是关键。您可以使用
[nskeyedArchivedDatawithRootObject:(id)]
[nskeyedUnarchiveObjectwithData:(NSData*)]
来序列化和取消序列化对象。
- (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;
            }
    ...
    }
}
- (NSDictionary*) proxyForJson
{
return [NSDictionary dictionaryWithObjectsAndKeys:self.name, @"name",
                                                  self.description, @"description",
                                                  self.imageURL, @"imageURL", 
                                                  nil];
}