2009-10-05 11 views
5

Je ne connais presque rien à JSON et j'ai besoin d'envoyer une requête à un serveur et de lire les données qui en proviennent, en utilisant uniquement l'iPhone. Pour cela, j'ai essayé d'utiliser le jason-framework , mais après avoir lu les documentations, je n'ai pas réussi à comprendre comment construire l'objet et l'envoyer à la demande. J'ai donc décidé d'adapter un autre code que j'ai vu ici sur SO.JSON IPHONE: Comment envoyer une requête JSON et extraire les données d'un serveur?

L'objet dont j'ai besoin est ceci:

{ "code": xxx}

Ici, j'ai un problème. Ce xxx est un NSData, donc je suppose que je dois convertir ces données en une chaîne, puis utiliser cette chaîne pour construire un objet et l'envoyer sur la requête.

la réponse du serveur est également un objet JSON, sous la forme

{ « réponse »: « yyy »} où yyy est un nombre compris entre 10000 et 99999

c'est le code que j'ai donc loin.

- (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]; 
} 

tout ce code me donne des erreurs. Ou BAD URL ou exception java.

Quel est le problème avec ce code?

Si vous les gars préfèrent donner une autre solution en utilisant le cadre JSON-s'il vous plaît me dire comment coder l'objet en utilisant cette paire (« code », « mon NSData converti ici pour string ») ...

merci pour toute aide.

Répondre

17

L'infrastructure JSON prend en charge la conversion de tableaux, de dictionnaires, de chaînes, de nombres et de booléens. Donc, ce que vous voulez faire est de convertir vos données à l'un de ces formats. Étant donné que vos données sont NSData plus simple est de le convertir avec:

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

Selon ce qui est dans la mémoire tampon (et si votre serveur peut gérer), vous voudrez peut-être base64 encode le résultat (vérifier http://www.cocoadev.com/index.pl?BaseSixtyFour si vous n » t avoir un convertisseur à portée de main). Vous pouvez même aller directement de NSData à une chaîne encodée en Base64.

Maintenant, créez un dictionnaire avec un élément avec la clé et la valeur codestringData (de l'étape précédente):

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

Ceci peut être facilement converti en JSON. Il suffit d'importer JSON.h dans votre tête de code, puis utilisez:

NSString* jsonString = [jsonDictionary JSONRepresentation]; 

videz et vous verrez votre chaîne JSON - quelque chose comme: {"code" : "{yourstringdata}"; }. Le moyen le plus simple d'envoyer ceci à votre serveur est d'utiliser la bibliothèque ASIHTTPRequest avec une méthode POST.

Une fois que vous obtenez le résultat à partir du serveur le cadre JSON peut l'analyser de nouveau dans un dictionnaire et vous pouvez obtenir les données dont vous avez besoin:

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

Merci !!!!!! c'est tout!La documentation de la bibliothèque ASIHTTPRequest est assez incomplète et superficielle (ce n'est pas votre faute), mais j'ai réussi à la faire fonctionner en utilisant vos instructions. Parfait! Vous êtes un homme! – SpaceDog

+0

Heureux que ça a marché pour vous. N'abandonnez pas sur ASIHTTPRequest. C'est assez simple une fois que vous avez compris. La seule chose à faire est de ne pas oublier de fournir les méthodes setDidFinishSelector/setDidFailSelector et de définir le délégué afin de recevoir une notification lorsque la mise en réseau échoue. Beaucoup trop de zones mortes de cellules là-bas. – Ramin