1

このjsonを解析しようとしていますが、「vis-progress-control」などのキーが変更される可能性があり、このタイプのjsonを解析する一般的なコードを構築しようとしているため、これを解析できるかどうかわかりません。「type」キーが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

  }
}

次に、それを行った後、たとえば、4番目のグラデーションの「度」フィールドを読み取りたい場合は、次の場所にあります。gradients[3][@"degrees"]

于 2013-02-08T01:03:51.700 に答える
0

ツリートラバーサルについて読んでください。ノードの「ツリー」をトラバースしたいように聞こえます。特定のリーフ値が見つかったら、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;
  }
}

うまくいけば、それで十分です。

于 2013-02-08T02:15:41.810 に答える