2010-09-02 57 views
2

摘要。基于一些benchmarks,我为我的iPhone JSON解析器选择了yajl-objc。我用一个任意的自定义类(一个NSNumber和两个NSString属性)测试它。如果我使用与类属性匹配的键值对创建了一个NSDictionary,我可以用[dictionary yajl_JSON]对字典进行编码。当我尝试直接使用[custom yajl_JSON]对自定义类的实例进行编码时,出现此编译器错误:使用yajl-objc编码自定义类

Terminating app due to uncaught exception 'YAJLParsingUnsupportedException', reason: 'Object of type (Custom) must implement dataUsingEncoding: to be parsed'

即使我实施了- (id)JSON(正如yajl-objc readme中所建议的),我也收到了错误。我知道我的代码,而不是库,是问题所在。我无法弄清楚我做错了什么。

详情。我Custom.h:

#import 
@interface Custom : NSObject { 

    NSString *name; 
    NSNumber *number; 
    NSString *text; 
} 

@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSNumber *number; 
@property (nonatomic, copy) NSString *text; 

@end

在Custom.m,我定义每yajl-OBJ文件的- (id)JSON方法:

- (id)JSON 
{ 
    NSDictionary *jsonDictionary = 
     [[[NSMutableDictionary alloc] init] autorelease]; 
    [jsonDictionary setValue:name forKey:@"name"]; 
    [jsonDictionary setValue:number forKey:@"number"]; 
    [jsonDictionary setValue:text forKey:@"text"]; 
    return jsonDictionary; 
}

创建键值匹配字典和编码正常工作:

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
    [dict setValue:self.custom.name forKey:@"name"]; 
    [dict setValue:self.custom.number forKey:@"number"]; 
    [dict setValue:self.custom.text forKey:@"text"]; 
    NSString *JSONString = [dict yajl_JSON];

但是当我打电话给NSString* JSONString = [custom yajl_JSON];这里的编译器错误和堆栈跟踪我得到:

*** Terminating app due to uncaught exception 'YAJLParsingUnsupportedException', reason: 'Object of type (Custom) must implement dataUsingEncoding: to be parsed' 
*** Call stack at first throw: 
(
0 CoreFoundation      0x0266bb99 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x027bb40e objc_exception_throw + 47 
2 CoreFoundation      0x02624238 +[NSException raise:format:arguments:] + 136 
3 CoreFoundation      0x026241aa +[NSException raise:format:] + 58 
4 TestCustomFileFormat    0x00005151 -[NSObject(YAJL) yajl_JSONWithOptions:error:] + 206 
5 TestCustomFileFormat    0x00005212 -[NSObject(YAJL) yajl_JSON:] + 49 
6 TestCustomFileFormat    0x00005249 -[NSObject(YAJL) yajl_JSON] + 49 
7 TestCustomFileFormat    0x00002eba -[TestViewController loadInstruction] + 758 
8 TestCustomFileFormat    0x00002aa5 -[TestViewController viewDidLoad] + 77 
9 UIKit        0x0037585a -[UIViewController view] + 179 
10 TestCustomFileFormat    0x00002377 -[TestCustomFileFormatAppDelegate application:didFinishLaunchingWithOptions:] + 112 
11 UIKit        0x002cc6a7 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163 
12 UIKit        0x002ceb30 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 346 
13 UIKit        0x002d8b6c -[UIApplication handleEvent:withNewEvent:] + 1958 
14 UIKit        0x002d12bc -[UIApplication sendEvent:] + 71 
15 UIKit        0x002d613f _UIApplicationHandleEvent + 7672 
16 GraphicsServices     0x02f4b81e PurpleEventCallback + 1578 
17 CoreFoundation      0x0264cff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
18 CoreFoundation      0x025ad807 __CFRunLoopDoSource1 + 215 
19 CoreFoundation      0x025aaa93 __CFRunLoopRun + 979 
20 CoreFoundation      0x025aa350 CFRunLoopRunSpecific + 208 
21 CoreFoundation      0x025aa271 CFRunLoopRunInMode + 97 
22 UIKit        0x002ce3ed -[UIApplication _run] + 625 
23 UIKit        0x002da272 UIApplicationMain + 1160 
24 TestCustomFileFormat    0x000022e4 main + 102 
25 TestCustomFileFormat    0x00002275 start + 53 
) 
terminate called after throwing an instance of 'NSException'

对此,我试图符合NSCoding,使用的NSKeyedArchiver创建类的实例的NSMutableData表示,并呼吁[data yajl_JSON],但也不能工作。

我知道我错过了一些简单的东西,但我太愚蠢了。

回答

1

你这样做是错误的。从您使用的对象创建JSON字符串yajl_JSONStringyail_JSON是否需要一个字符串(或一个NSData对象或可以归档的东西)并将其解析为对象。

+0

Sven,谢谢。我知道这是一个虚无的东西。现在精美的作品。 – jluckyiv 2010-10-02 04:09:03