【问题标题】:complex JSON parsing using Objective-C使用 Objective-C 进行复杂的 JSON 解析
【发布时间】:2011-04-19 10:07:58
【问题描述】:
{
   "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
      }
   }
}

这是 json 输出

如何解析 3 和 4 的项目,比如获取 id、energy 和 name

谢谢!

【问题讨论】:

    标签: objective-c json


    【解决方案1】:

    如果 Flight1 中的顺序无关紧要,以下应该可以工作:

    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"];
    
        …
    }
    

    否则,如果您希望按键按其数值排序:

    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"];
    
        …
    }
    

    【讨论】:

      【解决方案2】:

      假设您使用的是json framework,您可以这样访问它:

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

      这假设很多,因此请使用 try except 块或迭代不同的级别。

      【讨论】:

      • 先生。韦弗我很欣赏你的回答,但问题是如果键 3,4 是动态的,它们可以更改为 1,6,9,12,22 等等。只知道键“Flight1”如何解析它?
      • 使用valueForKey:而不是objectForKey:,你就不用担心除了块之外的尝试。
      • @jojaba 什么?! -objectForKey: 是在NSDictionary 中定义的 方法,用于返回给定键的对象。如果键不存在,它不会抛出异常——在这种情况下它只是返回nil
      • @Delta Boy 您的问题要求一种检索所需信息的方法。我实际上暗示您可能想要遍历不同的级别。它仍然是您的 json 结构,因此您的解析器必须适应它。因此,如果您想解析前两个级别,请使用快速枚举,它可以在字典和数组中使用。
      • @Batarious Nick 指定的 JSON 库返回 NSStringNSNumberNSArrayNSDictionary-valueForKey: 适用于任何课程,而 -objectForKey: 则不适用。
      猜你喜欢
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多