我認爲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