1

我正在尝试解析这个 json 并且不确定是否解析它,因为“vis-progress-control”之类的键可能会改变,我正在尝试构建一个解析这种类型的 json 的通用代码。我确信“类型”键将出现在 json 结构中。

NSDictionary *dict = [sData JSONValue];

NSArray *items = [dict valueForKeyPath:@"assets"];

NSLog(@"%@", items);

for (NSString *key in [[dict objectForKey:@"assets"]allKeys]) {

    for (NSString *subKey in [[[dict objectForKey:@"assets"] objectForKey:key]allKeys]) {
        NSLog(@"Value at subkey:%@ is %@\n",subKey,[[[dict objectForKey:@"assets"]objectForKey:key]objectForKey:subKey]);

         }
  }

我在 Github 上使用 SBJson 库。我的实际问题是当我不知道“vjs-progress-holder”键时如何访问“方向”、“度数”等?我还有一个嵌套在小部件数组中的小部件数组。我如何获得这些值?

4

2 回答 2

0

假设我在这里了解您的目标,您似乎想做这样的事情?

NSDictionary *outerDict = [sData JSONValue];
NSDictionary *assets = outerDict[@"assets"];

for (NSDictionary *asset in [assets allValues]) {

    NSString *type = asset[@"type"];

    if ([type isEqualToString:@"gradient"]) {

        float degrees = [asset[@"degrees"] floatValue];
        // and read whatever other values you need for gradients
    }

    if ([type isEqualToString:@"image"]) {

        // and read the appropriate values for images here... 

    }
}

所以我在这里做一个不同的假设,那就是你想要一个渐变数组。那么这看起来基本上是这样的:

NSDictionary *outerDict = [sData JSONValue];
NSDictionary *assets = outerDict[@"assets"];
NSMutableArray *gradients = [NSMutableArray array];

for (NSDictionary *asset in [assets allValues]) {

  NSString *type = asset[@"type"];

  if ([type isEqualToString:@"gradient"]) {

    // Add this asset to the list of gradients:
    [gradients addObject:asset];
  }

  if ([type isEqualToString:@"image"]) {

    // do something similar for images

  }
}

然后,在完成之后,如果您想读取第四个渐变的“度”字段,例如,您会在以下位置找到它gradients[3][@"degrees"]

于 2013-02-08T01:03:51.700 回答
0

阅读有关树遍历的信息。听起来你想遍历节点的“树”,当你找到一个特定的叶子值时,你将向后遍历一个级别并知道父级是你想要的容器。

所以想法是,一旦从 JSON 中解析出来,就忘记它是 JSON,因为现在它只是数组和字典中的一棵树。通过获取字典中的所有键来遍历它allKeys(返回键的数组),然后遍历它们以获取关联的值(使用类似(伪代码):

for ( NSString * key in allkeysarray) { 
  NSString * val = [dict objectForKey: key];
  if ( [val isEqualToString: @"gradient"] )
  {
     // now you know that this dictionary is the one you're looking for so you can maybe break out of this loop and just use the keys you know reference these values.
     break;
  }
}

希望这足以让你继续前进。

于 2013-02-08T02:15:41.810 回答