简体   繁体   中英

complex JSON parsing using Objective-C

{
   "Flight1":{
      "3":{
         "id":"10",
         "name":"JumboJet1B",
         "level":"1",
         "category":"1",
         "energy":"10",
         "bonus":"10",
         "completed":0
      },
      "4":{
         "id":"10",
         "name":"JumboJet1B",
         "level":"1",
         "category":"1",
         "energy":"10",
         "bonus":"10",
         "completed":0
      }
   }
}

This was the json output

How can I parse inside the items of 3 and 4, say getting the id, energy and name

Thanks!

If the order inside Flight1 doesn't matter, the following should work:

NSDictionary *flights = … // result from a JSON parser
NSDictionary *flight1 = [flights objectForKey:@"Flight1"];

for (NSString *key in [flight1 allKeys]) {
    NSDictionary *flight1Entry = [flight1 objectForKey:key];

    NSString *entryId = [flight1Entry objectForKey:@"id"];
    NSString *entryName = [flight1Entry objectForKey:@"name"];
    NSString *entryEnergy = [flight1Entry objectForKey:@"energy"];

    …
}

Otherwise, if you want the keys sorted according to their numeric value:

NSDictionary *flights = … // result from a JSON parser
NSDictionary *flight1 = [flights objectForKey:@"Flight1"];
NSArray *flight1Keys = [[flight1 allKeys] sortedArrayUsingComparator:^(id o1, id o2) {
    NSInteger i1 = [o1 integerValue];
    NSInteger i2 = [o2 integerValue];
    NSComparisonResult result;

    if (i1 > i2) result = NSOrderedDescending;
    else if (i1 < i2) result = NSOrderedAscending;
    else result = NSOrderedSame;

    return result;
}];

for (NSString *key in flight1Keys) {
    NSDictionary *flight1Entry = [flight1 objectForKey:key];

    NSString *entryId = [flight1Entry objectForKey:@"id"];
    NSString *entryName = [flight1Entry objectForKey:@"name"];
    NSString *entryEnergy = [flight1Entry objectForKey:@"energy"];

    …
}

Assuming that you are using the json framework you could access it like this:

NSDictionary *jsonDict = [jsonString JSONValue];

NSString *id = [[[jsonDict objectForKey:@"Flight1"] objectForKey:@"3"] objectForKey:@"id"];

This assumes alot, so make use of try except blocks or iterate through the different levels.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM