4

在我的应用程序中,我试图序列化服务器响应字典并将其写入文件系统。但是对于某些响应,我收到错误“属性列表对格式无效”。原因是服务器响应中的 CFNull 对象。现在,服务器响应将不断变化,所以我没有明确的方法来删除 CFNull 对象()。下面是我的代码:

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

解决这个问题的最佳方法是什么?如何一次性从服务器响应中删除所有 CFNull 对象?

4

4 回答 4

9

我在接收来自 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 转换为空字符串。

于 2012-01-19T06:24:51.577 回答
4

我切换到 NSKeyedArchiver 选项。比 NSPropertyListSerialization 慢一点,但会处理 NSNull/CFNull 对象。

于 2011-06-05T23:08:46.270 回答
1

我写了一个分类来清理字典:

-(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;
}
于 2016-07-06T13:01:59.010 回答
0

如果您无法通过datafromPropertyList:...API 对其进行序列化,则它不是属性列表。

要么修复服务器响应以获取正确的属性列表,要么在您的应用程序中处理数据,以便可以正确地将其解释为属性列表。

于 2011-06-05T19:58:03.290 回答