Как преобразовать объект класса в строку json в цели c

1. Я создаю объекты класса, а затем добавляю значение в мой класс с помощью этого кода

csJastorPollQuestion *pq = [[csJastorPollQuestion alloc] initWithID:@"01" Name:@"AAA"];

2. Я показал "csJastorPollQuestion" в NSLog, он присутствует

#<csJastorPollQuestion: id = (null) { ID = 01; Name = AAA; }>

3. Я конвертирую "csJastorPollQuestion" в строку json с этим кодом

NSData *jsd = [NSJSONSerialization dataWithJSONObject:pq options:NSJSONWritingPrettyPrinted error:&er];
NSString *jsonString = [[NSString alloc] initWithData:jsd encoding:NSUTF8StringEncoding];

4. Когда я запускаю свой проект, показывается ошибка

[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'

5. Какой правильный путь для преобразования "csJastorPollQuestion" в строку json?

2 ответа

Решение

dataWithJSONObject:options:error: Метод работает только на объектах, которые NSJSONSerialization знает, как конвертировать в JSON. Это означает:

  • Объект верхнего уровня должен быть NSArray или же NSDictionary
  • Содержащиеся объекты должны быть экземплярами NSString, NSNumber, NSArray, NSDictionary, или же NSNull,
  • Ключи словаря должны быть NSStrings
  • Числа не должны быть бесконечными или NaN,

Вы должны преобразовать в словарь или представление массива, чтобы использовать этот метод.

Я думаю, что вы должны отразить свой собственный объект в NSDictionary и использовать NSJSONSerialization конвертировать в строку JSON.

Отражать от атрибутов:

    - (NSDictionary *)dictionaryReflectFromAttributes
    {
        @autoreleasepool
        {
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            unsigned int count = 0;
            objc_property_t *attributes = class_copyPropertyList([self class], &count);
            objc_property_t property;
            NSString *key, *value;

            for (int i = 0; i < count; i++)
            {
                property = attributes[i];
                key = [NSString stringWithUTF8String:property_getName(property)];
                value = [self valueForKey:key];
                [dict setObject:(value ? value : @"") forKey:key];
            }

            free(attributes);
            attributes = nil;

            return dict;
        }
    }

Преобразовать в строку JSON:

    - (NSString *)JSONString
    {
        NSDictionary *dict = [self dictionaryReflectFromAttributes];
        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
        if (jsonData.length > 0 && !error)
        {
             NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
             return jsonString;
        }
        return nil;
    }
Другие вопросы по тегам