Обработка объектов CFNull в NSPropertyListSerialization - PullRequest
4 голосов
/ 05 июня 2011

В моем приложении я пытаюсь сериализовать словарь ответов сервера и записать его в файловую систему. Но я получаю сообщение об ошибке "Список свойств недопустим для формата" для некоторых ответов. Причина в объектах CFNull в ответе сервера. Теперь ответ сервера будет меняться, поэтому у меня нет определенного способа удалить объекты CFNull (). Ниже мой код:

NSString *anError = nil;
NSData *aData = [NSPropertyListSerialization dataFromPropertyList:iFile format:NSPropertyListXMLFormat_v1_0 errorDescription:&anError];

Как лучше всего решить эту проблему? Как я могу удалить все объекты CFNull из ответа сервера за один снимок?

Ответы [ 4 ]

9 голосов
/ 19 января 2012

У меня была проблема с получением ответа от Facebook SDK, поэтому я реализовал этот метод:

- (void)cleanDictionary:(NSMutableDictionary *)dictionary {
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    if (obj == [NSNull null]) {
        [dictionary setObject:@"" forKey:key];
    } else if ([obj isKindOfClass:[NSDictionary class]]) {
        [self cleanDictionary:obj];
    }
}];

}

Это обойдёт иерархию словаря и перевернет всеCFNulls в пустую строку.

4 голосов
/ 06 июня 2011

Я переключился на опцию NSKeyedArchiver. Немного медленнее, чем NSPropertyListSerialization, но заботится об объектах NSNull / CFNull.

1 голос
/ 06 июля 2016

Я написал категорию для очистки словаря:

-(NSDictionary*)cleanDictionary
{
    return [NSDictionary cleanDictionary:self];
}

+ (NSDictionary*)cleanDictionary:(NSDictionary *)dictionary
{
    NSMutableDictionary *dict = [NSMutableDictionary new];

    [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop)
    {
        if (obj == [NSNull null])
        {
            //dont add it
        }

        else if ([obj isKindOfClass:[NSDictionary class]])
        {
            [dict setObject:[self cleanDictionary:obj] forKey:key];
        }
        else if ([obj isKindOfClass:[NSArray class]])
        {
            [dict setObject:[NSDictionary cleanArray:obj] forKey:key];
        }
        else {
            [dict setObject:obj forKey:key];
        }
    }];

    return dict;
}

+(NSArray*)cleanArray:(NSArray*)array
{
    NSMutableArray* returnArray = [NSMutableArray new];

    for (NSObject *obj in array)
    {
        if (obj == [NSNull null])
        {
           //dont add it
        }
        if ([obj isKindOfClass:[NSDictionary class]])
        {
            [returnArray addObject:[NSDictionary cleanDictionary:(NSDictionary*)obj]];
        }
        else if ([obj isKindOfClass:[NSArray class]])
        {
            [returnArray addObject:[NSDictionary cleanArray:(NSArray*)obj]];
        }
        else
        {
            [returnArray addObject:obj];
        }
    }
    return returnArray;
}
0 голосов
/ 05 июня 2011

Если вы не можете сериализовать его через datafromPropertyList:... API, то это не список свойств.

Либо исправьте ответы сервера, чтобы сгладить надлежащие списки свойств, либо скопируйте данные в вашем приложении.такой, что его можно правильно интерпретировать как список свойств.

...