2011-05-27 1 views
1

J'ai un service OData qui peut renvoyer des valeurs JSON pour une collection d'objets. Je voudrais pointer une application iPhone sur une collection d'objets JSON hors de ce service (résultats présentés ci-dessous avec un exemple d'enregistrement).Comment puis-je extraire des valeurs JSON imbriquées dans une collection dans l'objectif-C?

Comment puis-je analyser ces valeurs imbriquées? Lorsque je convertis la chaîne de réponse en valeurs JSON, elle saisit uniquement "d" (mon code pour cela est également ci-dessous).

{ 
"d" : { 
"results": [ 
{ 
"__metadata": { 
"uri": "http://someserver/service.svc/collection(1234L)", "type": "My.Namespace.Type" 
}, "Property1": "value1", "Property2": 7274, "Collection1": { 
"__deferred": { 
"Property3": "http://someserver/service.svc/collection(1234L)/Images" 
} 
} 
}, 
... 

objectif Exemple de code C:

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    if (request.responseStatusCode == 200) 
    { 
     NSString *responseString = [request responseString]; 

     textView.text = responseString; 

     NSDictionary *responseDict = [responseString JSONValue]; 
     NSArray *keys = [responseDict allKeys]; 

     [self printArray:keys]; // This prints "d" 
     ... 
    } 
} 

Répondre

3

Il semble que vous avez une clé racine "d" et toutes les clés sont en sous-clés de fait, essayez

NSDictionary *responseDict = [[responseString JSONValue] objectForKey:@"d"]; 

ou même

NSArray *responseArray = [[[responseString JSONValue] objectForKey:@"d"] objectForKey:@"results"]; 

il est une alternance de NSArray et NSDictionnary:

NSDictionary *responseDict = [[responseString JSONValue] valueForKey:@"d"]; 
NSArray *responseArray = [responseDict valueForKey:@"results"]; 

NSDictionary *dict; 
for(int i=0; i< [responseArray count]; i++){ 
    dict = [responseArray objectAtIndex:i]; 
    NSLog(@"- %@",[responseArray objectAtIndex:i]); 

} 

cela dépend toujours fortement de votre générateur JSON. Donc, je ne peux pas vous dire avec certitude que c'est toujours la meilleure façon de creuser, mais dans ce cas, il semble que oui. Rappelez-vous:

  • [data1, données2, data3, données4] -> array
  • {key1: data1, key2: données2} -> dictionnaire
+0

Ceci est certainement là pour moi. Comment puis-je continuer à enchaîner pour aller plus bas? Est-ce la meilleure façon de creuser pour le tableau de valeurs souhaité? –

+0

Merci pour la mise à jour - bien que cela produise cette exception '- [__ NSArrayM allKeys]: sélecteur non reconnu envoyé à l'instance 0x4c458d0' (notez que je remplace l'initialisation responseDict avec votre deuxième ligne dans mon code ci-dessus) –

+0

j'ai édité, j'espère que c'est clair, laissez-moi savoir si non – chriscatfr

1

D'après les apparences, d est la clé d'un autre dictionnaire qui contient la clé results qui contient un tableau avec vos données. Essayez d'utiliser

NSLog(@"%@", responseDict); 

pour voir toute la hiérarchie d'arborescence.

+0

Merci, c'est certainement utile pour facilement imprimer le dictionnaire. Je voudrais arriver à une propriété individuelle quelques niveaux dans et cependant pas sûr de la meilleure façon de le faire (par exemple, comment obtenir la valeur de "Property1") –

Questions connexes