【问题标题】:Parsing a JSON of unknown Structure Objective-C解析未知结构的 JSON Objective-C
【发布时间】:2013-02-07 22:47:59
【问题描述】:

我正在尝试解析这个 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”键时如何访问“方向”、“度数”等? 我还有一个嵌套在小部件数组中的小部件数组。我如何也获得这些值?

【问题讨论】:

  • 您已经将 JSON 解析为字典和数组;你还想完成什么?
  • 我正在尝试获取单个元素,如颜色、边框半径、比率,而不使用“vis-progress-holder”等键这些名称可能会在新的 json 文件中更改
  • 您只是想遍历资产字典中的所有内容吗?您是否尝试将其转换为某种不同的结构?
  • @Firoze 我正在尝试遍历整个资产字典,以检查“类型”,如果它的类型为“梯度”,它有一些资产,如度数、阿尔法、比率等,但如果其他类型的它说“图像”它有一些资产,如cornerRadius等,我正在尝试提出一个通用解析器
  • 好吧,就@JesseRusak 而言,您已经有了一个通用的JSON 解析器。而且您已经可以打印整个资产字典。所以也许你可以多说一下你需要对每个键做什么?

标签: objective-c json nsarray


【解决方案1】:

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

所以想法是,一旦从 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;
  }
}

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

【讨论】:

    【解决方案2】:

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

    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"]找到它

    【讨论】:

    • 类似这样的东西。如果这对我有用,让我试试这个。谢谢。
    • 我几乎明白了我相信,这种“渐变”类型不是唯一的,几乎有 8 个实例?如何获取每种“渐变”类型的对应值
    • 这将遍历每个渐变,无论有多少。
    • 是的,我明白这一点。感谢您提供代码 sn-p。但我想单独提取每个度值。我已经使用了您提供的代码,此时它给了我 8“度”值,因为它应该是。我的问题是如何获得每个“度”值。
    • 你是说你想要一种方法来访问第 n 个梯度吗?您是否正在尝试构建渐变数组?很难确切地知道“获取每个'度'值”是什么意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2013-06-06
    • 2014-04-02
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多