顶部的挫折!!!
我从服务中获得了一些 JSON响应,我想将其存储在 .plist文件中以供将来参考。
我无法将 JSON响应保存到.plist文件。我认为这是由于响应中有一些null
值。
注意: 我使用 jsonparser确认响应为 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值(表示响应词典和文件路径但 0表示成功)。
问题:响应中几乎有 70-80个键值对,我不想删除/替换所有null
值。UITextField
因为我想要的是......
- 从服务器获取响应。
- 使用响应填充所有 UITextFields 。
- 使用 UITextFields 中的一些已编辑值向服务器发布相同的响应。
醇>
所以,我只想更改Object中的Edited {{1}}值并让它POST到服务器。
解决此问题的最佳方法是什么?
答案 0 :(得分:16)
我敢打赌你的JSON至少包含一个null
值。
当您拥有包含null
的JSON并使用NSJSONSerialization
进行转换时,null
将替换为NSNull
的实例。如果您的词典包含NSNull
,则writeToURL:atomically:
将失败。
这是因为只有当集合中的数据仅限于属性列表类型时,读取和写入字典(和数组)的便捷方法才有效。这些是:
NSString
NSNumber
NSData
NSDate
NSArray
NSDictionary
。对于词典,键必须是NSString
s。写作时也可以使用可变子类(如NSMutableString
)。
如果您的列表中没有任何内容,则无法使用writeToURL:atomically
或任何类似的便捷方法。
问题是某些有效的JSON无法转换为属性列表。此外,某些有效的属性列表无法转换为JSON(因为NSDate
不会自动转换为有效的JSON)。
如果是我,我只是将数据写入JSON文件。保留原始格式。您可以轻松地转换为/从JSON转换,所以请保持这种状态。
答案 1 :(得分:11)
如果您的词典包含NSNull
,则writeToURL:atomically
:将失败。
对于词典,键必须是NSStrings 。
问题是某些有效的 JSON 无法转换为属性列表。此外,某些有效的属性列表无法转换为 JSON 。
不要忘记,如果必须使用属性列表,则需要扫描整个字典并将空值转换为可以保存在属性列表文件中的内容。
只有解决方案是您必须检查所有 NULL值并将其替换为 @“”。
快乐编码......
答案 2 :(得分:3)
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];
答案 3 :(得分:1)
我以这种方式建立我的文件网址:
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 null]作为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类别中。
答案 4 :(得分:-1)
writeToURL:atomically:
方法的返回值是否返回YES。答案 5 :(得分:-1)
试试这个,它会起作用:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"];
[jsonData writeToFile:path atomically:YES];