代码之家  ›  专栏  ›  技术社区  ›  Aaron Bratcher

有人有使用encodeBytes:length:forKey:的示例代码吗?

  •  0
  • Aaron Bratcher  · 技术社区  · 13 年前

    显然,我的NSCoder类需要它,如果我能看到一个真实的例子及其相应的方法,它将非常有用。

    我觉得我需要它的原因是,当我的方法试图为NSString*编码Object时,它抱怨说:

    由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“ * -encodeBytes:length:forKey:仅为抽象类定义。定义-[JSONEncoder encodeBytes:length:forKey:]!'

    谢谢

    JSONEncoder中的方法:( https://github.com/ontometrics/JSONCoding )我无法使用静态库,所以我尝试直接使用代码。

    - (void)encodeObject:(id)object {
        [self push:object];
        [object encodeWithCoder:self];
    
        finalJSONObject = [NSDictionary dictionaryWithObject:[self topObject] forKey:[[[object class] description] camelcaseString]];
    
        [self pop];
    }
    
    1 回复  |  直到 13 年前
        1
  •  0
  •   Martin R    13 年前

    我认为 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
    

    然后您可以使用对此类的对象进行编码而不会出现问题 JSON编码器 :

    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 ,但输出不是很“好”,我不确定 JSON编码器 是这样使用的:

    JSONEncoder *encoder = [JSONEncoder encoder];
    NSNumber *obj = @1234;
    [encoder encodeObject:obj];
    NSString *json = [encoder json];
    NSLog(@"%@", json);
    // Output: {"__NSCFNumber":{"NS.intval":1234}}
    

    在这种情况下 encodeInt64:forKey: 方法 JSON编码器 在内部调用。

    然而,正如您所注意到的,它不适用于 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:]!
    

    出现异常的原因是 NS字符串 是 NSC编码 符合,但它使用 -encodeBytes:length:forKey: 编码器的,以及 JSON编码器 不实现此方法 .

    实现该方法并不太困难,这是一次快速而肮脏的尝试:

    - (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”中,那么您就可以编码一个普通的 NS字符串 在没有得到异常的情况下,结果如下所示:

    {"__NSCFConstantString":{"NS.bytes":"Hello world"}}
    

    但是,我不确定 JSON编码器 是这样使用的。