2010-07-23 29 views
5

Merhaba JSON çerçevesini bir sözlük içine dönüştüren dönüştürülmüş bir json dizim var ve içeriğimi ayıklamam gerekiyor. İç içe geçmiş sözlükleri nasıl yineleyebilirim?iç içe geçmiş sözlükler nesnel-c nasıl yinelenir iphone sdk

NSDictionary *results = [responseString JSONValue]; 
NSMutableArray *catArray = [NSMutableArray array]; 

for (id key in results) { 
    NSLog(@"key: %@, value: %@", key, [results objectForKey:key]); 
    [catArray addObject:key]; 
    NSString *cat = key; 
} 

birisi tuşlarının adını kullanmayan dic her kademesinde almak için nasıl bir örnek verebilir misiniz: Zaten beni sözlük görebilirsiniz olanak sağlayan bu kod var?

DIC sonucu yapısı şu şekildedir: http://www.freeimagehosting.net/uploads/e7c020d697.png

alt text http://www.freeimagehosting.net/uploads/e7c020d697.png

sayesinde

LDJ

+0

Üzgünüm seni takip etmiyorum. – ldj

cevap

5

yardımcı



for ((id) key in [results allKeys]) { 
    NSLog(@"key: %@, value: %@", key, [results objectForKey:key]); 
    [catArray addObject:key]; 
    NSString *cat = key; 
} 

Umut deneyin.

DÜZENLEME: Yapılarınızı doğru anladığınızdan emin değilim, ama yine de diktatörlüğünüz olan bazı değerleriniz var. İstediğiniz dictionairy özgü anahtar biliyorsanız

Danışmanın

for ((id) key in [results allKeys]) { 
    id value = [results objectForKey:key]; 
    if ([value isKindOfClass:[NSDictionary class]]) { 
     NSDictionary* newDict = (NSDictionary*)value; 
     for ((id) subKey in [newDict allKeys]) { 
      ... 
     } 
    } 
} 

, bunun için kontrol yerine kontrol edebilirsiniz: Başka bir birinin içine bulunan bir dictionairy aracılığıyla interate istiyorsanız bunu böyle yapabilirdi değer bir dict ise. Ama her iki durumda da kontrol etmek kötü bir fikir değildir ...

+0

Tobi Teşekkürler, Evet bu kod zaten bende var. Sanat (Antikalar, Züccaciye Eşyaları) altındaki tüm anahtarları nasıl alabileceğimi ve mülkler altında business_name girişini nasıl alabileceğimi gösteren bir örnekle daha çok ilgileniyorum. Bu hedefi sunmak için kod snippet'inizi düzenleyebilir misiniz? Teşekkürler – ldj

+0

Merhaba, yukarıdaki cevabımı düzenledim, öyle mi düşünüyorsunuz? – Tobi

9

Muhtemelen özyinelemeyi denemek zorundasınız. Bu, tüm anahtarları ve seviyesini listeler.

1

Sana bu noktada bu çözdük, ama uygun yinelemeli bir sözlük her tuşu kaydeder bir döngüsel fayda sınıf işlevi yazmak bulundu eminim: Ben Rekursif umut çalıştılar

/** 
* Recursively logs the keys and values of each object in the dictionary, 
* along with the class of the value. 
* 
* @param dict The dictionary to inspect 
*/ 
+ (void)logDictionaryKeys:(NSDictionary*)dict { 
    for (id key in dict) { 
     if ([dict[key] isKindOfClass:[NSDictionary class]]) { 
      [self logDictionaryKeys:dict[key]]; 
     }else { 
      NSLog(@"Key: %@", key); 
      NSLog(@"Value: %@ (%@)", dict[key], [dict[key] class]); 
     } 
    } 

    return; 
} 
0

Bu yardımcı olabilir.
P.S. Bu, anahtarın ilk oluşumunu döndürür.

+(id)getValue:(NSDictionary*)aDictionary forKey:(NSString *)aKey { 
    id finalValue = nil; 
    for (id key in [aDictionary allKeys]) { 
     id value = aDictionary[key]; 
     if (value != nil && [key isEqualToString:aKey]) { 
     finalValue = value; 
     break; 
     } 
     else if ([value isKindOfClass:[NSDictionary class]]) { 
     finalValue = [[self class] getValue:value forKey:aKey]; 
     } 
    } 
    return finalValue; 
} 
0

kategori başlık:

#import <Foundation/Foundation.h> 

@interface NSDictionary(Find) 

-(id) findflat:(NSString*)keyToFind; 

@end 

gövde:

#import "NSDictionary+Find.h" 

@implementation NSDictionary(Find) 

-(id) findflat:(NSString*)keyToFind{ 

    if([self objectForKey:keyToFind]) 
     return self[keyToFind]; 

    for(id key in self) 
     if([[self objectForKey:key] isKindOfClass:[NSDictionary class]]) 
      return [[self objectForKey:key] findflat:keyToFind]; 


    return nil; 
} 

@end 

Kullanım/Doğrulama:

- (void)testExample { 
// This is an example of a functional test case. 
// Use XCTAssert and related functions to verify your tests produce the correct results. 

NSDictionary *dic = @{}; 
XCTAssertNil([dic findflat:@"url"]); 

dic = @{@"url":@"http://"}; 
XCTAssertEqual([dic findflat:@"url"],@"http://"); 

dic = @{@"other":@4}; 
XCTAssertNil([dic findflat:@"url"]); 

dic = @{@"other":@4,@"url":@"http://"}; 
XCTAssertEqual([dic findflat:@"url"],@"http://"); 

dic = @{@"other":@4,@"sd":@"sdf"}; 
XCTAssertNil([dic findflat:@"url"]); 

dic = @{@"other":@4,@"dic":@{@"url":@"http://"}}; 
XCTAssertEqual([dic findflat:@"url"],@"http://"); 

dic = @{@"other":@4,@"dic":@{@"sd":@2,@"url":@"http://"}}; 
XCTAssertEqual([dic findflat:@"url"],@"http://"); 

dic = @{@"other":@4,@"dic":@{}}; 
XCTAssertNil([dic findflat:@"url"]); 

dic = @{@"other":@4,@"dic":@{@"dic":@{@"sd":@2,@"url":@"http://"}}}; 
XCTAssertEqual([dic findflat:@"url"],@"http://"); 

}

İlgili konular