2012-09-28 102 views
1

我有一個數組,我填充,我反過來想放置在一個強類型的對象。我有這個代碼已經填充了json數據,我想用這些數據填充我的設置對象。我怎樣才能做到這一點?從json數組創建一個強類型的對象

JSON響應:

GOT響應爲:

[ 
    { 
     "CatalogID":2377, 
     "Category":"Frozen", 
     "Facings":true, 
     "ID":13, 
     "LastUpdateDateTime":"\/Date(1348681365520-0700)\/", 
     "Quantity":true 
    }, 
    { 
     "CatalogID":2377, 
     "Category":"Fruit", 
     "Facings":true, 
     "ID":10, 
     "LastUpdateDateTime":"\/Date(1348692069843-0700)\/", 
     "Quantity":false 
    }, 
    { 
     "CatalogID":2377, 
     "Category":"Salads", 
     "Facings":true, 
     "ID":12, 
     "LastUpdateDateTime":"\/Date(1348681354807-0700)\/", 
     "Quantity":true 
    }, 
    { 
     "CatalogID":2377, 
     "Category":"Vegetables", 
     "Facings":true, 
     "ID":11, 
     "LastUpdateDateTime":"\/Date(1348681334523-0700)\/", 
     "Quantity":true 
    } 
] 

目標C

-(void) connectionDidFinishLoading:(NSURLConnection *)connection { 

NSError *error = nil; 
// Get the JSON data from the website 

id result = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error]; 

NSStringEncoding responseEncoding = NSUTF8StringEncoding; 
if ([response textEncodingName]) { 
    CFStringEncoding cfStringEncoding = CFStringConvertIANACharSetNameToEncoding((__bridge CFStringRef)[response textEncodingName]); 
    if (cfStringEncoding != kCFStringEncodingInvalidId) { 
     responseEncoding = CFStringConvertEncodingToNSStringEncoding(cfStringEncoding); 
    } 
} 

if(receivedData) 
{ 
    NSString *dataString = [[NSString alloc] initWithData:receivedData encoding:responseEncoding]; 

    NSLog(@"Got response as %@", dataString); 

} 

if ([result isKindOfClass:[NSArray class]]) { 

    for (NSArray *item in result) { 
     NSArray *items = [item valueForKey:@"ID"]; 

     [_settings addObject:items]; 

     // Try to populate Setting object 
     Setting *setting = (Setting *)[_settings objectAtIndex:0]; 

     NSLog(@"Setting: %@", setting); 
    } 
} 
else { 
    NSDictionary *jsonDictionary = (NSDictionary *)result; 

    for(NSDictionary *item in jsonDictionary) 
     NSLog(@"Item: %@", item); 
} 

NSLog(@"Finished"); 
} 

Setting.h

@interface Setting : NSObject { 

NSString *_settingsID; 
NSString *_catalogID; 
NSString *_category; 
NSString *_facings; 
NSString *_quantity; 
} 

@property (nonatomic, retain) NSString *settingsID; 
@property (nonatomic, retain) NSString *catalogID; 
@property (nonatomic, retain) NSString *category; 
@property (nonatomic, retain) NSString *facings; 
@property (nonatomic, retain) NSString *quanity; 

- (Setting *)initWithName:(NSString *)settingsID desc:(NSString *)category; 

@end 

Setting.m

@implementation Setting 

@synthesize settingsID = _settingsID; 
@synthesize catalogID = _catalogID; 
@synthesize category = _category; 
@synthesize facings = _facings; 
@synthesize quanity = _quantity; 

- (Setting *)initWithName:(NSString *)settingsID desc:(NSString *)category CategoryID:(NSString *)catalogID Facings:(NSString *)facings Quantity:(NSString *)quantity { 

if ((self = [super init])) { 

    self.settingsID = settingsID; 
    self.catalogID = catalogID; 
    self.category = category; 
    self.facings = facings; 
    self.quanity = quantity; 
} 

return self; 

} 

@end 
+0

什麼不工作? – rdelmar

+0

我只是不確定如何填充它。我知道noobie的問題,但我很新的iOS編程。任何幫助將不勝感激。 – brianhevans

+0

我可以幫你解決這個問題,但是看看實際結果會是有用的。所以,如果可以的話,在「if([result isKindOfClass:[NSArray class]])」之後「,記錄結果並編輯你的帖子以顯示。 – rdelmar

回答

2

您發佈的代碼中存在相當多的錯誤。我將通過它們並告訴你如何正確地做到這一點,但我強烈建議你研究NSArray,NSDictionary和NSString的文檔,以熟悉這些類中可用的方法 - 你實際上不能甚至開始編寫體面的代碼,而無需很好地瞭解這些類。

1)我真的不知道你想用字符串編碼的東西和if(receivedData)之後的代碼做什麼。沒有必要將JSON轉換爲字符串,JSONObjectWithData:方法將數據轉換爲數組(更準確地說是一組字典),這就是您需要處理的內容。

2)在你的for-in循環中,item應該被鍵入爲NSDictionary,而不是數組。數組中的每個項目都是您發佈的JSON中{}之間的整個字典。

3)你在for-in循環中的所有代碼都是錯誤的 - 我不知道你想要做什麼。你需要做的是獲取字典中各個鍵的值,將init分配給設置實例,並在擴展的init方法中傳遞值。 4)你的設置對象只是爲你的JSON數據中的一個字典保留值,所以你需要創建另一個數組來保存你的響應中每個字典的一個設置對象(我在下面的例子中將它稱爲settingsArray )。 5)您的Setting類中的init方法在.h和.m中是不同的,它們應該看起來像.m版本,除了每個冒號後面的名稱部分應該是小寫字母不大寫。

所以,這裏是我認爲會起作用的代碼。由於我無法訪問您的JSON,因此無法對其進行測試,因此請嘗試一下並返回結果。

所以,在你正在做的下載類,你應該有一個屬性,settingsArray,和下面的代碼connectionDidFinishLoading方法:

-(void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    self.settingsArray = [NSMutableArray array]; 
    NSError *error = nil; 
    id result = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error]; 
    if ([result isKindOfClass:[NSArray class]]) { 

     for (NSDictionary *item in result) { 
      NSString *settingsID = [item objectForKey:@"ID"]; 
      NSString *category = [item objectForKey:@"Category"]; 
      NSString *categoryID = [item objectForKey:@"CatalogID"]; 
      NSString *facings = [item objectForKey:@"Facings"]; 
      NSString *quantity = [item objectForKey:@"Quantity"]; 

      Setting *setting = [[Setting alloc] initWithName:settingsID desc:category categoryID:categoryID facings:facings quantity:quantity]; 
      [self.settingsArray addObject:setting]; 
     } 

    } 
} 

在設置init方法應該是這樣的:

- (Setting *)initWithName:(NSString *)settingsID desc:(NSString *)category categoryID:(NSString *)catalogID facings:(NSString *)facings quantity:(NSString *)quantity { 

    if ((self = [super init])) { 

     self.settingsID = settingsID; 
     self.catalogID = catalogID; 
     self.category = category; 
     self.facings = facings; 
     self.quanity = quantity; 
    } 

    return self; 

} 

編輯後:如果您想找到基於另一個屬性的值設置的屬性之一的值,你可以做這樣的:

for (Setting *aSetting in _settingsArray) { 
     if ([aSetting.category isEqualToString:@"Frozen"]) { 
      NSLog(@"%@",aSetting.facings); 
     } 
    } 
+0

這正是我正在尋找的!我還有其他一些問題。引用帖子頂部的JSON。注意類別「Fruit」對於Facings具有「true」的值。假設我想從現在存儲在NSDictionary中的所有數據中獲取特定值。我該如何做到最好?後續問題與CoreData有關,在我們將這個問題分類之後,我會問。謝謝! – brianhevans

+0

所有字典對於Facings都是真實的,所以我不確定你在問什麼。此外,不知道你在說什麼NSDictionary - 你的數據現在存儲在一個NSArray的設置對象。請更具體一些,我會盡力回答。 – rdelmar

+0

好的,所以Settings數組有類別:冷凍,水果,沙拉和蔬菜。每個類別都有一個Facings設置,可以是真或假。如果我特意查找「凍結」設置,並且想知道存儲在該設置中的值(在上例中爲真),我該如何獲取?我想是這樣,如果([self.settings valueForKey:@ 「類別」] == @ 「凍結」){ 的NSString * valueForFrozen = [self.settings valueForKey:@ 「面向」]; 的NSLog(@ 「值對於冷凍:%@」,valueForFrozen); } – brianhevans