2011-06-05 14 views
4

在我的應用程序中,我試圖序列化服務器響應字典並將其寫入文件系統。但是我收到一些錯誤「屬性列表對於格式無效」。原因是服務器響應中的CFNull對象。現在,服務器響應將會持續變化,所以我沒有明確的方法來刪除CFNull對象()。以下是我的代碼:處理NSPropertyListSerialization中的CFNull對象

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

解決此問題的最佳方法是什麼?如何從服務器響應中一次性刪除所有CFNull對象?

+0

一個更好的問題可能要問,爲什麼CFNull值不能存儲在屬性列表! – 2012-01-17 05:20:25

回答

4

我切換到NSKeyedArchiver選項。比NSPropertyListSerialization慢一點,但照顧NSNull/CFNull對象。

+0

優秀!我「學習」的那些東西之一,然後幾年後,忘記。我想知道爲什麼我記得我可以歸檔到文件系統,但是NSPropertyListSerialization沒有這個選項! – 2015-09-30 18:22:14

0

如果您不能通過datafromPropertyList:... API對其進行序列化,那麼它不是屬性列表。

要麼將​​服務器響應修復爲正確的屬性列表或按摩應用中的數據,以便將其正確解釋爲屬性列表。

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進空字符串。

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; 
}