10

楼上的无奈!!!

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

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

所以,我只想更改UITextField对象中的编辑值并让它 POST 到服务器。

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

4

6 回答 6

16

我敢打赌,您的 JSON 至少包含一个null值。

当您拥有包含的 JSONnull并使用 对其进行转换时NSJSONSerialization,将null替换为NSNull. 如果您的字典包含NSNullwriteToURL:atomically:则将失败。

这是因为读取和写入字典(和数组)的便捷方法仅在集合中的数据仅限于属性列表类型时才有效。这些都是:

  • NSString
  • NSNumber
  • NSData
  • NSDate
  • NSArray
  • NSDictionary. 对于字典,键必须是NSStrings。

您还可以NSMutableString在编写时使用可变子类(如 )。

如果您有任何不在该列表中的内容,则不能使用writeToURL:atomically或任何类似的便捷方法。

问题是某些有效的 JSON 无法转换为属性列表。此外,一些有效的属性列表无法转换为 JSON(因为NSDate不会自动转换为有效的 JSON)。

如果是我,我只会将数据写入 JSON 文件。保留其原始格式。您可以轻松地与 JSON 进行转换,因此请保持这种状态。

于 2013-03-20T19:57:40.657 回答
11

如果您的字典包含NSNull,则writeToURL:atomically: 将失败。

对于字典,键必须是 NSStrings

问题是某些有效的JSON无法转换为属性列表。此外,一些有效的属性列表无法转换为JSON

不要忘记,如果必须使用属性列表,则需要扫描整个字典并将空值转换为可以保存在属性列表文件中的内容。

唯一的解决方案是您必须检查所有NULL 值并将其替换为@" "

快乐的编码...

于 2013-04-01T10:00:38.140 回答
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];
于 2013-03-24T07:15:23.263 回答
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 类别中。

于 2013-03-20T15:05:18.437 回答
-1
  • 检查writeToURL:atomically:方法的返回值是否返回YES。
  • 如果没有,请检查您是否对该 URL 具有写入权限。
  • 尝试使用另一个 URL 来确定是它的路径还是导致此错误的字典的内容。
于 2013-03-20T14:30:30.823 回答
-1

试试这个,它会工作:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"country.plist"];
[jsonData writeToFile:path atomically:YES];
于 2013-03-20T15:29:19.280 回答