Кодирование пользовательских классов с использованием yajl-objc

Сводка. Основываясь на некоторых эталонных показателях, я выбрал yajl-objc для парсера iPhone JSON. Я тестировал его с произвольным пользовательским классом (одно свойство NSNumber и два свойства NSString). Если бы я создал NSDictionary с парами ключ-значение, соответствующими свойствам класса, я мог бы закодировать словарь с помощью [dictionary yajl_JSON]. Когда я попытался напрямую закодировать экземпляр пользовательского класса с помощью [custom yajl_JSON], я получил эту ошибку компилятора:

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

У меня возникла ошибка, даже когда я внедрил - (id)JSON (как указано в readme yajl-objc ). Я знаю, что проблема в моем коде, а не в библиотеке. Я просто не могу понять, что я делаю неправильно.

Подробности. Мой 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 я определил метод - (id)JSON в соответствии с документацией yajl-obj:

- (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], но это тоже не сработало.

Я знаю, что упускаю что-то простое, но я слишком глуп, чтобы понять это.


person jluckyiv    schedule 02.09.2010    source источник


Ответы (1)


Вы делаете это неправильно. Чтобы создать строку JSON из объекта, вы используете yajl_JSONString. yail_JSON предназначен для того, чтобы взять строку (или объект NSData, или что-то, что можно заархивировать) и разобрать ее на объекты.

person Sven    schedule 30.09.2010
comment
Свен, спасибо. Я знал, что это что-то идиотское. Прекрасно работает сейчас. - person jluckyiv; 02.10.2010