![](/img/trans.png)
[英]filter an NSArray, which contains NSDictionary within NSDictionary
[英]How to serialize a NSDictionary/NSArray/Property List (plist) which contains NSNull
我想使用NSNull
在NSMutableDictionary
存儲一些空值,然后使用屬性列表序列化此數據。 問題是不允許NSNull
並且出現“屬性列表格式無效”錯誤。 有沒有解決方法? 似乎很奇怪,他們沒有將NSNull
放在有效的plist對象列表中。
我在序列化之前將NSArray或NSDictionary轉換為NSData。 以下是nsarray上用於序列化和反序列化的類別。 這舒適地處理了一些數據為nsnull
@implementation NSArray(Plist)
-(BOOL)writeToPlistFile:(NSString*)filename{
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self];
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES];
return didWriteSuccessfull;
}
+(NSArray*)readFromPlistFile:(NSString*)filename{
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:filename];
NSData * data = [NSData dataWithContentsOfFile:path];
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}
與其使用屬性列表,不如考慮使用NSKeyedArchiver和NSKeyedUnarchiver。 屬性列表具有一組固定的類型,並且不包括NSNull,並且不打算擴展。
以下是相關文檔的鏈接: NSCoding , NSKeyedArchiver和NSKeyedUnarchiver 。
不,沒有辦法將NSNull
放在屬性列表中。 (瑣事:二進制屬性列表格式實際上支持空值,但編寫器未實現支持。)
對於字典,最簡單的解決方法是簡單地過濾掉空值,因此{foo =“ bar”; baz = null; }變成{foo =“ bar”; }。
從NSPropertyListSerializationClass的文檔中:
屬性列表對象。 plist必須是一種NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary對象。 容器對象還必須僅包含此類對象。
因此,您需要其中之一。 根據數據的類型,您可以放置一個占位符而不是NSNull,然后在加載.plist之前/之后進行一個處理(例如,使用零長度的NSData對象在plist中表示您的NSNull)。 究竟哪種占位符取決於您要存儲哪種數據,並選擇要避免的東西。 然后,在加載后,將空的NSData轉換回NSNull。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.