Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将JSON响应写入.plist文件_Iphone_Ios_Objective C_Json_Plist - Fatal编程技术网

Iphone 将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 *

顶上的挫折

我从服务中获得了一些JSON响应,我想将其存储在.plist文件中以供将来参考。 我无法将JSON响应保存到.plist文件。我认为这是由于响应中包含了一些
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
值。因为我想要的是

  • 从服务器获取响应
  • 用响应填充所有UITextFields
  • 使用UITextFields中的一些编辑值将相同的响应发布到服务器
  • 因此,我只想更改对象中已编辑的
    UITextField
    值,并将其发布到服务器

    解决此问题的最佳方法是什么?
    • 检查
      writeToURL:atomically:
      方法的返回值是否返回YES
    • 如果没有,请检查您是否具有该URL的写入权限
    • 请使用另一个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
      。对于字典,键必须是
      NSString
      s
    编写时还可以使用可变子类(如
    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:它与简单字典配合得很好。这个问题是由于