Iphone 将JSON响应写入.plist文件
顶上的挫折强> 我从服务中获得了一些JSON响应,我想将其存储在.plist文件中以供将来参考。 我无法将JSON响应保存到.plist文件。我认为这是由于响应中包含了一些Iphone 将JSON响应写入.plist文件,iphone,ios,objective-c,json,plist,Iphone,Ios,Objective C,Json,Plist,顶上的挫折 我从服务中获得了一些JSON响应,我想将其存储在.plist文件中以供将来参考。 我无法将JSON响应保存到.plist文件。我认为这是由于响应中包含了一些null值 注意:我确认响应为JSON格式使用 我的代码: NSError *error; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSDictionary *
null
值
注意:我确认响应为JSON格式使用
我的代码:
NSError *error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSDictionary *dictResult = [(NSDictionary*)json objectForKey:@"myKey"];
NSLog(@"Result Dictionary :: %@",dictResult);
NSURL *cacheDir = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *path = [cacheDir URLByAppendingPathComponent:@"FinalResult.plist"];
NSLog(@"Path :: %@",path);
BOOL success = [dictResult writeToURL:path atomically:YES];
NSLog(@"success? %d", success);
注意:我得到了所有的NSLog值(表示响应字典和文件路径,但为成功)
问题:响应中几乎有70-80个键值对,我不想删除/替换所有
null
值。因为我想要的是
UITextField
值,并将其发布到服务器
解决此问题的最佳方法是什么?- 检查
方法的返回值是否返回YESwriteToURL:atomically:
- 如果没有,请检查您是否具有该URL的写入权限
- 请使用另一个URL进行尝试,以确定是不是字典的路径或内容导致了此错误
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSString *filename = @"FinalResult.plist";
NSString *pathFilename = [path stringByAppendingPathComponent:filename];
然后看看它是否写:
BOOL success = [dictResult writeToFile:pathFilename atomically:YES];
NSLog(@"success? %d", success);
编辑-有趣的是,我最近遇到了这个问题,然后就把它忘得一干二净了。一些JSON解析器将使用[NSNull]作为nil值的占位符。我写了这篇文章(说真的,大约两周前,然后在上面隔了一段时间)来清理解析结果
- (NSDictionary *)compact:(NSDictionary *)aDictionary {
NSDictionary *answer = [NSMutableDictionary dictionary];
for (NSString *key in [aDictionary allKeys]) {
id value = [self.dictionary valueForKey:key];
if (value && value != [NSNull null]) {
[answer setValue:value forKey:key];
}
}
return [NSDictionary dictionaryWithDictionary:answer];
}
如果您愿意,可以将其添加到NSDictionary类别中 试试这个,它会起作用的:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"];
[jsonData writeToFile:path atomically:YES];
我打赌您的JSON至少包含一个
null
值
如果JSON包含null
,并使用NSJSONSerialization
对其进行转换,null
将被NSNull
的实例替换。如果您的词典包含NSNull
,则writeToURL:atomically:
将失败
这是因为只有当集合中的数据被限制为属性列表类型时,读取和写入字典(和数组)的方便方法才起作用。这些是:
NSString
NSNumber
NSData
NSDate
NSArray
。对于字典,键必须是NSDictionary
sNSString
NSMutableString
)
如果您有任何不在该列表中的内容,则不能使用原子方式的writeToURL:atomically
或任何类似的方便方法
问题是一些有效的JSON无法转换为属性列表。此外,一些有效的属性列表无法转换为JSON(因为NSDate
不会自动转换为有效的JSON)
如果是我,我会将数据写入JSON文件。保留原始格式。您可以轻松地将JSON转换为JSON或从JSON转换为JSON,所以不要这样做。如果您的字典包含
NSNull
,则writeToURL:atomicaly
:将失败
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [paths objectAtIndex:0];
NSString *filename = @"FinalResult.plist";
NSString *pathFilename = [libraryPath stringByAppendingPathComponent:filename];
NSDictionary *dictResult = [json objectForKey:@"myKey"];
[dictResult writeToFile:pathFilename atomically:YES];
对于字典,键必须是NSStrings
问题是一些有效的JSON无法转换为属性列表。此外,一些有效的属性列表无法转换为JSON
不要忘记,如果必须使用属性列表,则需要扫描整个字典,并将空值转换为可以保存在属性列表文件中的内容。
唯一的解决方案是您必须检查所有空值,并将其替换为@“
快乐编码…JSON字典包含哪些类型的数据?字符串,数字,还有别的吗?你能将JSON添加到你的问题中吗?@TomHarrington:我的JSON字典包含了你在回答中提到的几乎所有类型的值。+1。是的,你完全正确。在我的JSON响应中有一些值。那么该怎么办呢?正如我所说,我认为最好的办法是将数据保留为JSON并将其写入文件,而不是尝试使用属性列表。如果必须使用属性列表,则需要扫描整个字典,并将空值转换为可以保存在属性列表文件中的内容。我想说的不仅仅是“我同意”,因此,我将支持@TomHarrington所说的,我确实有一个将json转换为PropertyList的应用程序,以便可以将其写入NSUserDefaults。要做到这一点,JSON响应中的值的唯一解决方案是逐个识别它们,而不是转换/不写出它们。@TomHarrington:我想用响应中的值更改编辑后的值。。。我认为按照你的建议,这是不可能的。就好像我将数据保留为JSON并将其写入文件,那么它就不能以我想要的方式更新。@Vin然后,正如我所说,您需要扫描JSON以查找并删除任何无效的属性列表。我得到了路径,但未创建.plist文件。@Vin可以用一个字符串键和值构建您自己的字典,请参阅写入的内容?既然你从Jason那里得到了字典,我想这里的每个人都认为它是可序列化的,但是让我们开始运行它。一本简单的字典写得好会告诉我们很多。@danh:它与简单字典配合得很好。这个问题是由于