Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XCode] loop door een JSON dictionary

Pagina: 1
Acties:

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 06-10 17:24
Hello :),

Ik haal van een server een JSON object op, die ik in Xcode wil doorlopen. Nu lukt het me om het hoogste niveau te doorlopen, maar op het moment dat ik dat doe (om vervolgens een niveau dieper te doorlopen) lijkt alle onderliggende informatie verdwenen en lijk ik enkel de toplevel informatie over te houden.

Ter verduidelijking van het verhaal;

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    NSData *allProductsData = [[NSData alloc] initWithContentsOfURL:
                               [NSURL URLWithString:@"http://www.temp.nl/json2.php"]];
    
    NSError *error;
    NSMutableDictionary *allCourses = [NSJSONSerialization
                                       JSONObjectWithData:allProductsData
                                       options:NSJSONReadingMutableContainers
                                       error:&error];
    if( error )
    {
        NSLog(@"%@", [error localizedDescription]);
    }
    else {

        //NSLog(@"y: %@",allCourses);

        for(NSDictionary *eachProduct in allCourses) {
            
            NSLog(@"x: %@",eachProduct);
            //NSLog(@"x: %@",[eachProduct objectForKey:@"name"]);
        }
    }


JSON:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "regel1": 
        {
            "id":"1",
            "name":"naam1",
            "image":"image1"
        }
    ,
    "regel2": 
        {
            "id":"2",
            "name":"naam2",
            "image":"image2"
        }
    
    
}


Log ik de hele dictionary (allCourses) krijg ik dit netjes:
C:
1
NSLog(@"y: %@",allCourses); 


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
2014-05-29 15:17:31.832 temp[7569:60b] 
y: {
    regel1 =     {
        id = 1;
        image = image1;
        name = naam1;
    };
    regel2 =     {
        id = 2;
        image = image2;
        name = naam2;
    };
}



Ga ik een niveau dieper dmv de for loop, dan krijg ik wel de objecten, maar niet de onderliggende informatie:
C:
1
NSLog(@"x: %@",eachProduct); 


code:
1
2
2014-05-29 15:13:17.862 temp[7540:60b] x: regel2
2014-05-29 15:13:17.866 temp[7540:60b] x: regel1


Probeer ik iets op key niveau te doen, gaat het helemaal mis:
C:
1
NSLog(@"x: %@",[eachProduct objectForKey:@"name"]);

code:
1
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x15da6140'



Wat doe ik verkeer? Waardoor "verdwijnt" de informatie?

  • scr4p3r
  • Registratie: December 2006
  • Laatst online: 08-09 08:45
Je omliggende JSON is een JSON object (en geen JSON array), dit object bevat 'regel1' en 'regel2' met sub-objecten. Het parsen gaat prima, het levert een NSDictionary op. Als je vervolgens een for-in constructie toepast op een NSDictionary krijg je alle keys uit de dictionary. De keys zijn dan 'regel1' en 'regel2', tevens zijn deze keys van type NSString.

Het type was je gebruikt in je for lus op regel 17 is dus niet NSDictionary maar NSString. De reden dat je dus de foutmelding krijgt is dat je de functie 'objectForKey' probeerd een te roepen op een NSString. Deze heeft deze functie niet, vandaar de melding.

Om op te lossen:
C:
1
2
3
for (NSString *key in allCourses) {
    id eachProduct = allCourses[key];
}


Voor dictonary reads zoals in JS e.d.: http://nshipster.com/object-subscripting/

  • LocoShady
  • Registratie: Mei 2003
  • Laatst online: 06-10 17:24
Bedankt! Hier kom ik inderdaad verder mee! :)

Verwijderd

Ondanks dat de manier van scr4p3r prima zal werken, prefereer ik het volgende:

Objective-C:
1
2
3
4
NSDictionary *dict = @{@"test": @1, @"blaat": @2};
[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    NSLog(@"%@ = %@", key, obj);
}];


Meer informatie over de verschillende manieren:
https://www.mikeash.com/p...umeration-techniques.html