2009-10-05 3 views
5

내가 JSON에 대해 거의 아무것도 모르는 나는 단지 아이폰을 사용하여 서버에 요청을 보내고 그것에서 오는 데이터를 읽을 필요가있다.JSON IPHONE : JSON 요청을 보내고 서버에서 데이터를 가져 오는 방법은 무엇입니까?

나는 jason-framework 을 사용해 보았지만 문서를 읽은 후에는 개체를 생성하고 요청시 보내는 방법을 알 수 없었습니다. 그래서 저는 여기에서 보았던 또 다른 코드를 적용하기로 결정했습니다.

내가 필요로하는 객체는 이것이다 :

{ "코드"XXX} 여기

나는 문제가있다. 이 xxx는 NSData이므로이 데이터를 문자열로 변환 한 다음이 문자열을 사용하여 객체를 작성하고 요청시이 데이터를 보내야한다고 생각합니다. YYY는 10000 및 99999

사이의 숫자입니다 이 내가 지금 가지고있는 코드 :

는 서버 응답

{ "YYY" "대답은"} 형태로, 또한 JSON 객체입니다 멀리.

- (NSString *)checkData:(NSData) theData { 
    NSString *jsonObjectString = [self encode:(uint8_t *)theData length:theData.length];  
    NSString *completeString = [NSString stringWithFormat:@"http://www.server.com/check?myData=%@", jsonObjectString];        
    NSURL *urlForValidation = [NSURL URLWithString:completeString];    
    NSMutableURLRequest *validationRequest = [[NSMutableURLRequest alloc] initWithURL:urlForValidation];       
    [validationRequest setHTTPMethod:@"POST"];    
    NSData *responseData = [NSURLConnection sendSynchronousRequest:validationRequest returningResponse:nil error:nil]; 
    [validationRequest release]; 
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; 
    NSInteger response = [responseString integerValue]; 
    NSLog(@"%@", responseString); 
    [responseString release]; 
    return responseString; 
} 


- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length { 
    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData *data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t *output = (uint8_t *)data.mutableBytes; 

    for (NSInteger i = 0; i < length; i += 3) { 
     NSInteger value = 0; 
     for (NSInteger j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger index = (i/3) * 4; 
     output[index + 0] = table[(value >> 18) & 0x3F]; 
     output[index + 1] =     table[(value >> 12) & 0x3F]; 
     output[index + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[index + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    ret 

    urn [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease]; 
} 

이 코드는 모두 오류입니다. 또는 BAD URL 또는 Java 예외.

이 코드에 어떤 문제가 있습니까?

너희들은 ... 어떻게 쌍 ("코드", "내을 NSData 여기에 문자열로 변환")를 사용하여 객체를 인코딩 방법을 가르쳐주십시오 JSON 프레임 워크를 사용하여

덕분에 다른 솔루션을 제공하려는 경우 어떤 도움이든.

답변

17

JSON 틀 배열, 사전, 문자열, 숫자, 부울 변환 지원한다. 따라서 데이터를 이러한 형식 중 하나로 변환하십시오. 데이터가있는 NSData 때문에 가장 쉬운 방법은 그것을 변환하는 것입니다 :

NSString* stringData = [[NSString alloc] initWithData:yourData 
              encoding:NSUTF8StringEncoding]; 

(그리고 서버가 처리 할 수있는 경우) 버퍼에 무엇에 따라이 Base64로 할 수 있습니다

는 결과 (당신이 '돈 경우 http://www.cocoadev.com/index.pl?BaseSixtyFour을 확인 인코딩 변환기가 있으면 편리합니다.) NSData에서 Base64로 인코딩 된 문자열로 곧바로 갈 수 있습니다.

지금 키 code 한 항목 (마지막 단계에서) 값 stringData로 사전을 만들 :

NSDictionary* jsonDictionary = [NSDictionary dictionaryWithObject:stringData 
                  forKey:@"code"]; 

이 쉽게 JSON 변환 할 수 있습니다.

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

그것을 밖으로 덤프 당신은 당신의 JSON 문자열을 볼 수 있습니다 - 같은 : : 그냥 코드 헤더에 JSON.h을 가져, 다음 사용 {"code" : "{yourstringdata}"; }합니다. 이것을 서버에 전송하는 가장 쉬운 방법은 ASIHTTPRequest 라이브러리를 POST 방법과 함께 사용하는 것입니다.

다시 서버에서 결과를 얻을 JSON 프레임 워크는 사전에 다시 구문 분석 할 수 다음 당신이 필요로하는 데이터 나갈 수있게되면 :

NSDictionary* responseDict = [yourJSONResponseStringFromServer JSONValue]; 
NSNumber* answerNum = (NSNumber *) [responseDict objectForKey:@"answer"]; 
int answer = [answerNum intValue]; 
+0

감사합니다 !!!!!! 그게 다야!ASIHTTPRequest 라이브러리 설명서는 매우 불완전하고 외면적인 것이지 귀하의 지침을 사용하여 작동하도록 만들었습니다. 완전한! 당신은 D 남자입니다! – SpaceDog

+0

그것은 당신을 위해 일한 것을 기쁘게 생각합니다. ASIHTTPRequest를 포기하지 마십시오. 일단 당신이 그것에 익숙해지면 꽤 간단합니다. 유일한 문제는 setDidFinishSelector/setDidFailSelector 메서드를 제공하고 네트워킹이 실패 할 때 알림을받을 수 있도록 대리인을 설정하는 것입니다. 너무 많은 셀 데드 존이있을거야. – Ramin

관련 문제