我认为JSONEncoder
主要是指编码从自定义类对象(必须实现NSCoding
协议)。例如,如果你定义一个类Person
一个字符串属性:
@interface Person : NSObject <NSCoding>
@property(strong, nonatomic) NSString *name;
@end
@implementation Person
- (id)initWithCoder:(NSCoder *)coder {
if ((self = [super init])) {
self.name = [coder decodeObjectForKey:@"name"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.name forKey:@"name"];
}
@end
那么你可以使用JSONEncoder
编码没有问题这个类的一个对象:
JSONEncoder *encoder = [JSONEncoder encoder];
Person *obj = [[Person alloc] init];
obj.name = @"John";
[encoder encodeObject:obj];
NSString *json = [encoder json];
NSLog(@"%@", json);
// Output: {"person":{"name":"John"}}
它的工作原理也与一些“纯”基础类型,例如与NSNumber
,但输出是不是很“漂亮”,我不知道,如果JSONEncoder
意味着这样使用:
JSONEncoder *encoder = [JSONEncoder encoder];
NSNumber *obj = @1234;
[encoder encodeObject:obj];
NSString *json = [encoder json];
NSLog(@"%@", json);
// Output: {"__NSCFNumber":{"NS.intval":1234}}
在这种情况下,JSONEncoder
的encodeInt64:forKey:
方法在内部调用。
然而,当你注意到没有,它不与NSString
工作:
JSONEncoder *encoder = [JSONEncoder encoder];
NSString *obj = @"Hello world";
[encoder encodeObject:obj];
// Exception: *** -encodeBytes:length:forKey: only defined for abstract class. Define -[JSONEncoder encodeBytes:length:forKey:]!
的原因的例外是,NSString
是NSCoding
兼容,但它使用的编码器的-encodeBytes:length:forKey:
,并JSONEncoder
不实施此方法。
实施该方法是不是太困难,这是一个快速和肮脏的尝试:
- (void)encodeBytes:(const uint8_t *)bytesp length:(NSUInteger)lenv forKey:(NSString *)key
{
NSString *s = [[NSString alloc] initWithBytes:bytesp length:lenv encoding:NSUTF8StringEncoding];
[self setObject:s forKey:key];
}
如果添加此代码为“JSONEncoder.m”,那么你就可以编码一个普通NSString
没有得到一个例外,结果是这样的:
{"__NSCFConstantString":{"NS.bytes":"Hello world"}}
但同样,我不知道如果JSONEncoder
意味着这样使用。
http://www.mikeash.com/pyblog/friday-qa-2010-08-12-implementing-nscoding.html – trojanfoe 2013-02-22 16:09:10
博客提到该方法,但没有给出示例代码。 – 2013-02-22 16:37:09
@AaronBratcher:或许你应该展示你的班级的定义以及你迄今为止的尝试。帮助解决具体问题更容易。 – 2013-02-22 18:04:24