2012-08-16 2 views
1

내 iphone/ipad 프로젝트에이 간단한 json 파일이 있습니다.NSJSONSerialization - json 파일로 개체 수정

{"initial_page" : Page_Selected} 

Page_Selected 내가 UIPickerView 통해 "initial_page"의 값을 수정하려는 NSInteger

입니다. 그렇게하는 방법?

물론 난 이미 UiPickerWiew 선택 부분을 한 적이과 JSON 수정에 대해, 나는

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

함수로를 기록합니다.

작업이 [[jsonParsed setInteger:row forKey:@"initial_page"] 일 수도 있지만 이런 식으로 디버거가 "인식 할 수없는 선택기 보내기"예외를 반환합니다.

"initial_page" 키를 사용하여 json 매개 변수를 수정해야하는 부분 만 필요합니다.

누구든지 나를 도와 줄 수 있습니까?


그게 내가 가진거야.

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 물론 나는 pdf 대신 필터로 json을 사용한다.

0

먼저, Page_Selected의 초기 값을 숫자로 지정하여 json을 유효하게 설정해야합니다. 그렇지 않으면 구문 분석을 할 수 없습니다.예를 {"initial_page" : -1} 이처럼 당신은 잘못된 초기 값의 것을 확실히 알고 당신은 +JSONObjectWithData:options:error: 방법

그런 다음 당신이 실제로 얻을 수정할 수 있습니다 예를 들어 옵션으로 구문 분석 할 때,

그런 사고에 의해 사용 NSJSONReadingMutableContainers를 지정하지 않습니다 NSMutableDictionary의 :

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

내가 제안한 것을 포함하여 편집했지만 값을 변경하지 않습니다 ... –

+0

실제로 파일을 디스크에 저장하지 않으므로 사전을 JSON NSData로 serialize하고 다음 중 하나를 사용하십시오. 'writeToFile :'또는'writeToURL :'메소드 –

+0

내 변경 사항보기 및 다른 답변보기 ... –

0

"커밋"또는 "저장"의 일종이 명령은 순서가 지속적으로 만들어?

JSON을 파일로 다시 작성해야합니다.

NSJSONSerialization의 -dataWithJSONObject:options:error: 메서드를 사용하여 NSData를 만든 다음 파일에 기록합니다. 앱 번들의 리소스에는 쓸 수 없습니다.

+0

그 중 가장 좋은 해결책은 sql lite 데이터베이스이지만, "앱 번들의 리소스에 쓰지 말아야하는 이유는 무엇입니까? "? –

+0

거의 없지만 파일에 수정이 없습니다 ... –

0

option으로 바꾸고 dataWithJSONObject function.now에서 시뮬레이터에서만 작동합니다.