Iphone 如何在IOS sdk(Objective-c)中序列化类?
如何在objective-c中序列化以下类,以便与SBJson一起使用 当我使用此代码时,出现“JSON序列化不支持动物”错误 有人能指出我哪里出了问题吗 Animal.h文件的内容如下所示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
#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];
}