Ios 有没有人有使用encodeBytes:length:forKey:的示例代码?
显然,我的NSCoder类需要它,如果我能看到一个真实的例子及其相应的方法,它将非常有用 我觉得需要它的原因是当我的方法尝试为NSString*编码对象时,它抱怨说: 由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:'*-encodeBytes:长度:forKey:仅为抽象类定义。定义-[JSONECODER ENCODER encodeBytes:length:forKey:!' 谢谢 jsonecoder()中的方法我无法让静态库工作,所以我尝试直接使用代码Ios 有没有人有使用encodeBytes:length:forKey:的示例代码?,ios,objective-c,Ios,Objective C,显然,我的NSCoder类需要它,如果我能看到一个真实的例子及其相应的方法,它将非常有用 我觉得需要它的原因是当我的方法尝试为NSString*编码对象时,它抱怨说: 由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:'*-encodeBytes:长度:forKey:仅为抽象类定义。定义-[JSONECODER ENCODER encodeBytes:length:forKey:!' 谢谢 jsonecoder()中的方法我无法让静态库工作,所以我尝试直
- (void)encodeObject:(id)object {
[self push:object];
[object encodeWithCoder:self];
finalJSONObject = [NSDictionary dictionaryWithObject:[self topObject] forKey:[[[object class] description] camelcaseString]];
[self pop];
}
我认为
jsonecoder
主要用于对自定义类中的对象进行编码(自定义类必须实现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
它也有一些“普通”的基础类型,例如用<代码> NStOuts< /Cord>,但是输出不是很“好”,我不确定<代码> JSONEncoder <代码>是否会被这样使用:
JSONEncoder *encoder = [JSONEncoder encoder];
NSNumber *obj = @1234;
[encoder encodeObject:obj];
NSString *json = [encoder json];
NSLog(@"%@", json);
// Output: {"__NSCFNumber":{"NS.intval":1234}}
在这种情况下,内部调用jsonecoder
的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:
,而jsonecoder
不实现此方法
实现该方法并不太困难,这是一个快速而肮脏的尝试:
- (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];
}
如果将此代码添加到“jsonecoder.m”,则可以对普通的NSString
进行编码,而不会出现异常,结果如下所示:
{"__NSCFConstantString":{"NS.bytes":"Hello world"}}
但是,我也不确定
jsonecoder
是否应该这样使用。该博客提到了该方法,但没有给出示例代码。@AaronBratcher:也许你应该展示你的类的定义以及你迄今为止所做的尝试。帮助解决具体问题更容易。NSString与NSCoder兼容。。。我们需要查看您的代码,因为错误消息听起来像是您正在向JSONECODER实例发送encodeObject:
。我愿意尝试一下。我想你没有相反的办法把绳子拿回来吗?@AaronBratcher:我又想了一次。根据“JSON文本是一个序列化对象或数组”,对象是一个集合名称/值对。换句话说,顶级JSON对象始终是字典或数组。因此,将单个字符串编码为JSON没有多大意义。我认为您应该将字符串包装到自定义类中并对其进行编码。-顺便说一句,你为什么需要JSONECODER呢?NSDictionary和NSArray可以使用内置的NSJSONSerialization类进行编码。字符串应按以下方式编码为对象:variableName:value。与使用JSONECODER编码的其他类型非常相似。我希望接收JSON并将其发送到我的服务器,并将其直接解析到自定义类中或从自定义类中解析出来。@AaronBratcher:但是带有字符串属性的自定义类似乎可以工作(请参见我回答中的Person
示例)。也许我还不明白你的问题。也许您可以显示自定义类的定义。看看所有这些,我想我只需要添加一个特定的encodeString方法。我希望在这个过程中了解编码字节。
{"__NSCFConstantString":{"NS.bytes":"Hello world"}}