2012-09-28 2 views
1

강하게 입력 된 객체에 배치하려는 배열을 채 웁니다. json 데이터로 채워진이 코드가 있고이 데이터로 Setting 개체를 채우고 싶습니다. 어떻게해야합니까?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

,617,
@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 루프에서 항목은 배열이 아닌 NSDictionary로 입력해야합니다. 배열의 각 항목은 게시 한 JSON의 {} 사이에있는 전체 사전입니다.

3) for-in 루프에있는 모든 코드가 잘못되었습니다. 그 코드로 무엇을 하려는지 말할 수 없습니다. 당신이해야 할 일은 사전에있는 다양한 키들에 대한 값을 얻고, init 인스턴스에 Setting을 할당하고, 그 확장 된 init 메소드로 값을 전달하는 것입니다.

4) 설정 개체는 JSON 데이터의 사전 중 하나에 대한 값만 유지하므로 응답에 각 사전에 대해 하나의 설정 개체를 보유 할 다른 배열을 만들어야합니다 (아래 예에서 settingsArray로 이름을 지정 함).).

5) Setting 클래스의 init 메소드는 .h와 .m에서 서로 다르며, .m 콜론과 비슷해야합니다. 단, 각 콜론 다음의 이름은 대문자가 아니어야합니다.

그래서 여기에 제가 생각하는 코드가 있습니다. JSON에 액세스 할 수 없으므로 테스트 할 수 없으므로 시험해보고 결과를 나와 다시 확인하십시오.

-(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]; 
     } 

    } 
} 

설정의 초기화 방법은 다음과 같아야합니다

그래서, 당신은 당신의 다운로드를하고있는 클래스에서, 당신은 connectionDidFinishLoading 방법의 속성, settingsArray, 다음과 같은 코드가 있어야합니다

편집 후
- (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을 참조하십시오. Facings에 대해 "Fruit"카테고리의 값이 "true"임을 유의하십시오. NSDictionary에 저장된 모든 데이터에서 특정 값을 얻고 싶습니다. 어떻게하면 좋을까요? 후속 질문은 CoreData와 관련이 있으며,이 질문을 정렬 한 후에 요청할 것입니다. 감사! – brianhevans

+0

모든 사전은 Facings에 적용됩니다. 그래서 당신이 무엇을 묻고 있는지 확실하지 않습니다. 또한, 당신이 NSDictionary로 무엇을 말하고 있는지 확실하지 않습니다 - 당신의 데이터는 이제 Setting 객체의 NSArray에 저장됩니다. 좀 더 자세히 설명해 주시면 답변 드리겠습니다. – rdelmar

+0

좋아, 그래서 설정 배열에는 카테고리 : 냉동, 과일, 샐러드 및 야채 있습니다. 이 범주들 각각은 Facings에 대한 설정이 true 또는 false 일 수 있습니다. 내가 특별히 "Frozen"설정을 찾고 있는데 위의 예제 에서처럼 Facings에 대한 Setting에 저장된 값을 알고 싶다면 어떻게해야합니까? 나는 다음과 같이 생각했다. ([self.settings valueForKey : @ "Category"] == @ "Frozen") { NSString * valueForFrozen = [self.settings valueForKey : @ "Facings"]; NSLog (@ "Value for Frozen : % @", valueForFrozen); } – brianhevans

관련 문제