NSJSONSerialization - 将对象修改为json文件

时间:2012-08-16 08:32:58

标签: objective-c json nsjsonserialization

我的iphone / ipad项目中有这个简单的json文件。

{"initial_page" : Page_Selected}

Page_SelectedNSInteger

我想通过UIPickerView修改"initial_page"的值。怎么做?

当然我已经完成了UiPickerWiew选择部分和json修改,我会将其写入

-(void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponents:(NSInteger)component{ }

功能

也许完成这项工作的函数是[[jsonParsed setInteger:row forKey:@"initial_page"]但是这样,调试器会返回我"无法识别的选择器已发送"异常。

我只需要用json作为键修改"initial_page"参数的部分。

任何人都可以帮助我吗?


这就是我得到的。

NSError *jsonParsingError = nil;
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"json"];
NSMutableDictionary *configJson = [NSJSONSerialization
                JSONObjectWithData:[NSData dataWithContentsOfFile:filePath]
                options:NSJSONReadingMutableContainers error:&jsonParsingError];

[configJson setValue:[NSNumber numberWithInt:row] forKey:@"initial_page"];

NSLog(@"%@",jsonParsingError);

最后一行返回(null),所以json文件没问题。

但是,如果我打印出[configJson objectForKey:@"inital_page"],那么我可以看到它发生变化......那么,是否有一种"提交"或者"保存"命令以使其持久化?


以下建议:

NSData * modified = [NSJSONSerialization dataWithJSONObject:configJson options:NSJSONWritingPrettyPrinted error:&jsonParsingError];

[modified writeToFile:filePath options:NSDataWritingAtomic error:&jsonParsingError];
NSLog(@"returned error: %@", [jsonParsingError localizedDescription]);

再次,最后一行返回(null)但我无法在文件中找到任何修改


更改后,我可以保存initial_page的修改,但这仅适用于iPhone/iPad Simulator,而不适用于实际的设备调试。

这就是我的所作所为:

if([modified wirteToFile:filePath options:NSDataWritingFileProtectionNone error:&jsonParsingError])
   NSLog(@"writing ok")
else
   NSLog(@"not ok with error :%@",jsonParsinError);

Iphone simulator对最后4行没有问题,但是当我在物理iPhone上运行时,最后NSLog给出了:

"not ok with error : Error Domain=NSCocoaErrorDomain Code=513 The Operation Could not be completed. Operation not permitted"

似乎在写json文件时拒绝了许可。

4 个答案:

答案 0 :(得分:1)

问题解决了:主要的错误概念是在主包中编写和/或修改文件。现在我在NSDocumentDirectory

中执行此操作

这样,我没有错误,我可以直接在iPhone中读取/写入数据。

我遵循了本指南:link当然我使用json作为过滤器而不是pdf。

答案 1 :(得分:0)

首先,您应该通过将Page_Selected的初始值指定为数字来使您的json有效,否则您将无法解析它。例如{"initial_page" : -1},因此您确定它是无效的初始值,并且您不会意外使用它

然后在解析时,指定NSJSONReadingMutableContainers作为+JSONObjectWithData:options:error:方法

的选项

然后您可以实际修改获得的NSMutableDictionary实例:

[jsonDictionary setValue:[NSNumber numberWithInt:row] forKey:@"initial_page"]

答案 2 :(得分:0)

  

是否有一种“提交”或“保存”命令才能使其持久化?

您需要将JSON写回文件。

使用NSJSONSerialization的-dataWithJSONObject:options:error:方法创建NSData,然后将其写入文件。请注意,您不应尝试写入应用程序包中的资源。

答案 3 :(得分:0)

NSDataWritingFileProtectionNone作为option添加到dataWithJSONObject函数中。现在它仅适用于模拟器。