2012-08-16 44 views
1

我在我的iphone/ipad項目中有這個簡單的json文件。NSJSONSerialization - 將對象修改爲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文件時被拒絕的權限。

回答

1

問題解決了:主要錯誤的概念是編寫和/或修改主包中的文件。現在我在NSDocumentDirectory

這樣做,我得到沒有錯誤,我可以讀/寫數據直接在/從iPhone。

我遵循本指南:link當然我使用json作爲過濾器而不是pdf。

0

首先,你應該通過指定初始值Page_Selected作爲數字來使你的json有效,否則你將無法解析它。例如{"initial_page" : -1}所以你肯定知道這是一個無效的初始值和解析的時候,你會不會被意外使用它

然後,指定NSJSONReadingMutableContainers作爲一個選項,+JSONObjectWithData:options:error:方法

那麼實際上你可以修改獲得實例的NSMutableDictionary

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

我編輯了包括你的建議,但它不會改變值... – 2012-08-16 14:50:01

+0

它實際上並沒有將文件保存到磁盤,可能你想要將字典序列化回JSON'NSData'並使用其中一個'writeToFile:'''或'writeToURL:'方法 – 2012-08-17 09:57:55

+0

看到我的更改和其他答案... – 2012-08-17 13:59:34

0

是有一種「提交」或「保存」命令,以使其執着?

您需要將JSON寫回到文件。

使用NSJSONSerialization的-dataWithJSONObject:options:error:方法創建一個NSData,然後將其寫入文件。請注意,您不應該嘗試寫入應用程序包中的資源。

+0

我知道,最好的解決方案是sql lite數據庫,但爲什麼「你不應該嘗試寫入應用程序包中的資源「?幾乎有 – 2012-08-16 19:46:55

+0

,但文件中沒有修改... – 2012-08-16 20:10:03

0

NSDataWritingFileProtectionNone作爲optiondataWithJSONObject function.now它只適用於我在模擬器上。