将JSON响应写入.plist文件

时间:2013-03-20 14:17:25

标签: iphone ios objective-c json plist

顶部的挫折!!!

我从服务中获得了一些 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因为我想要的是......

  
      
  1. 从服务器获取响应。
  2.   
  3. 使用响应填充所有 UITextFields
  4.   
  5. 使用 UITextFields 中的一些已编辑值向服务器发布相同的响应。
  6.   

所以,我只想更改Object中的Edited {{1}}值并让它POST到服务器。

解决此问题的最佳方法是什么?

6 个答案:

答案 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。
  • 如果没有,请检查您是否具有该URL的写入权限。
  • 尝试使用其他网址,查看是否有导致此错误的字典路径或内容。

答案 5 :(得分:-1)

试试这个,它会起作用:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"];
[jsonData writeToFile:path atomically:YES];