2014-03-02 4 views
1

JSON으로 NSDictionary를 NSArray로 인코딩하여 PHP 웹 서비스에 업로드하려고합니다. 나는 웹 서비스를 요청하기 전에JSON에서 iOS에서 PHP로 배열의 배열을 인코딩하는 방법

NSString * jsonRequest = [NSString stringWithFormat: @"{\"request\":\"syncBookmark\",\"bookmark_array\":\"%@\",\"user_id\":\"%@\"}", jsonString, user_id, nil]; 
NSData * requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

에서, JSON 인코딩 된 문자열이 같다 :

NSError * error; 
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:my_array_1 options:0 error:&error]; 
NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; 

가 그럼 난하여 다른 배열로 JSON 문자열을 삽입합니다

내가 JSON 인코딩 방법 내있는 NSArray입니다 :

{"request":"syncBookmark","bookmark_array":"[{\"PostId\":\"4\",\"last_edit_date\":\"2014-03-03 01:05:37\",\"BookmarkId\":\"1\",\"last_sync_date\":\"\",\"is_active\":\"1\"}]","user_id":"7"} 

PHP에서 'user_id'를 '7'로 올바르게 반올림 할 수 있지만 ' 그는 배열 - is_array ($ bookmark_array) PHP에서 그것은 단지 거짓을 반환합니다. 배열을 배열에 잘못 두는 방법입니까?

+0

PHP 코드 –

+1

을 보내주십시오. "JSON 포함/중첩"(실제로 JSON으로 인코딩 된 두 번 인코딩)을 사용하려는 경우에만 추가 조작이 필요합니다. 이것은 비정상적인 일이 될 수 있으므로 그렇게하지 않아야 할 가능성이 큽니다. Rob이 제안한 것처럼 JSON 인코딩을 통해 데이터를 두 번 실행하면보다 효과적이고 안정적으로 데이터를 처리 할 수 ​​있습니다. 일반적으로 배열을 사전에 넣거나 사전에 JSON 인코딩을하여 배열을 사전 (또는 다른 배열)에 배치합니다. JSON 인코더는 중첩 배열/사전을 처리하는 방법을 알고 있습니다. –

+0

(JSON은 매우 이해하기 쉽고 사용하기 쉽다. 일단 이해했다면 json.org로 가서 구문을 배우는 데 5-10 분을 소비한다.그런 다음 JSON "객체"가 iOS "NSDictionary"에 완벽하게 매핑되고 JSON "배열"이 iOS NSArray에 완벽하게 매핑된다는 것을 이해하십시오. 그래서 좋은 JSON 인코더/디코더를 사용하는 한 두 양식간에 앞뒤로 변환하는 것은 쉽습니다. 다른 조작은 99 % 필요하지 않습니다.) –

답변

4

stringByReplacingOccurrencesOfString 작업을 수행하지 마십시오. NSJSONSerialization에 필요한 모든 인용문을 작성하십시오. 당신이 정말로 필요로하는 경우

그래서, 당신의 PHP, 그냥 JSON 다음 재귀 않은 인코딩 배열을 인코딩 할 것이다 문자열로 jsonString 다른 사전에 있음을 넣어 다음 다시 인코딩 :

NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:my_array_1 options:0 error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

NSDictionary *dictionary = @{@"request"  : @"syncBookmark", 
          @"bookmark_array" : jsonString, 
          @"user_id"  : user_id}; 

NSData *finalData  = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 

그것은 당신이 당신의 질문에서 원한다고 말했던 것처럼 페이로드를 만들어야합니다.

좀 더 논리적 인 접근 방식이 될 것이라고했다 가졌 :

NSError *error; 

NSDictionary *dictionary = @{@"request"  : @"syncBookmark", 
          @"bookmark_array" : my_array_1, 
          @"user_id"  : user_id}; 

NSData  *finalData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 

그 다음 PHP가 json_decode에 여러 통화를 할 필요가 없습니다 것입니다, 당신의 페이로드를 생성 무엇합니다.

5

문자열로 JSON 문자열을 입력했기 때문에 이것은 분명히 stringWithFormat 메서드로 이스케이프 처리됩니다.

NSDictionary을 만들어 함께 직렬화해야합니다. 따라서 my_array_1 변수를 직렬화하는 대신 사전을 직렬화합니다.

는 사전 만들기 :

NSDictionary* dictionary = @{ @"request" : @"syncBookmark", @"bookmark_array" : my_array_1 }; 

그런 다음 사전을 직렬화 :

NSError * error; 
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 
NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

이, JSON 개체를 직렬화 다른 문자열로 직렬화 된 객체를 삽입하지 않도록 올바른 방법입니다. 나는 왜 당신이 그것을하고 싶었는지 알지만.

관련 문제